延續昨天的在 Build Code 時把 Jar 打包成 Docker Image 的部份,今天要實作把打包完成的 Docker Image 自動的在 Build 完 Image 之後 Push 到 Docker Hub 上,這樣就不用另外的下 docker tag
和 docker push
指令,才能把 Docker Image Push 到 Docker Hub 上。
一. 修改 build.sbt 的檔案如下
dockerfile in docker := {
val appPath = "/app"
val jarFile: File = sbt.Keys.`package`.in(Compile, packageBin).value
val classpath = (managedClasspath in Compile).value
val mainclass = "idv.jack.example.AkkaHTTPExample"
val jarTarget = s"${appPath}/${jarFile.getName}"
val classpathString = classpath.files.map(s"${appPath}/" + _.getName)
.mkString(":") + ":" + jarTarget + ":."
new Dockerfile {
from("java")
add(classpath.files, s"${appPath}/")
add(jarFile, jarTarget)
entryPoint("java", "-cp", classpathString, mainclass)
}
}
lazy val tag = taskKey[Unit]("Execute the docker tag shell script")
tag := {
"docker tag default/akkahttp-docker-example jackyohhub/akkahttp-docker-example"!
}
lazy val push = taskKey[Unit]("Execute the push to docker registry")
push := {
"docker push jackyohhub/akkahttp-docker-example"!
}
完整的程式在 GitHub 上,網址如下:
https://github.com/jackyoh/akkahttp-docker-example/blob/master/build.sbt
這裡最主要的地方就是在 tag 和 push 的地方,只要有在 sbt 指令後面加上 tag 和 push 參數,就會先把 Docker Image 建立一個能 Push 到 Docker Hub 上的 Image 格式 ("DockerHub 帳號/Image Name"),最後再把 Docker Image Push 到 Docker Hub 上。
二. 把 Build 完的 Jar 檔,打包在 Docker Image 裡並且把此 Docker Image Push 到 Docker Hub 上
$ docker login
執行的畫面如下
$ sbt docker tag push
執行的結果如下
三. 執行完成可以看到 Docker Image 已經 Push 到 Docker Hub 上,畫面如下
四. 測試把 Docker Image Pull 到其它的 Host 上執行,指令如下
$ docker run -d -p 9090:8080 jackyohhub/akkahttp-docker-example
畫面如下
輸入http://10.1.3.243:9090/hello 的URL 就可以看到以下的畫面。IP 為執行 Docker 那台 Host 的 IP:
完整的程式放在 GitHub 上,有興趣的話可以參考看看,網址如下:
https://github.com/jackyoh/akkahttp-docker-example
這二天介紹的把開發的程式打包成 Docker Image 和自動的把 Docker Image Push 到 Docker Hub 上,最主要的目的是要讓在開發程式和佈署程式這一段更加的自動化,避免換了一個環境之後確忘了安裝一些套件或是少設定到幾個參數而造成開發完成的程式無法執行。