在今年七月寫了一篇『在 Travis 升級 Docker 和 docker-compose 版本』,就在上個月底 Travis 終於將 Docker 預設版本換成 1.12.x 版本,並且將 docker-compose 也一併升級到 1.8.0,這樣就可以不用手動升級了。那這篇會紀錄如何用 Travis 自動編譯 Docker Image 並且上傳到 Docker Hub。Docker Hub 提供兩種方式讓開發者上傳 Image,第一種是透過 Command line 下指令手動上傳,另外一種則是在 Docker Hub 後台指定 Dockerfile 路徑及需要執行編譯的分支,這樣只要 Push commit 到 Github,Docker Hub 就會根據 Dockerfile 來自動編譯 Docker Image。本篇會介紹如何透過 Travis 服務來自動上傳 Dokcer Image,像是 Golang 的部屬方式通常是編譯出 Binary 執行檔後,將此執行檔加入 Image 最後才上傳。
在 Travis 啟動 Docker Service
啟動方式非常簡單,只要加入底下程式碼到.travis.yml
services: - docker
準備 Dockerfile 編譯 Image
我們用 Golang 為例,底下是 Dockerfile 範例FROM alpine:3.4 RUN apk update && \ apk add \ ca-certificates && \ rm -rf /var/cache/apk/* ADD drone-line /bin/ ENTRYPOINT ["/bin/drone-line"]接著透過底下指令編譯出 Dokcer Image
$ docker build --rm -t $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE) .
DEPLOY_ACCOUNT
是 Dokcer hub 帳號,以我的帳號為例就是 appleboy,DEPLOY_IMAGE
則是 Image 名稱。請將這指令寫道 .travis.yml
內的 script
內
script: # 執行測試 - make test # 通過測試後開始編譯 Image - docker build --rm -t $DEPLOY_ACCOUNT/$DEPLOY_IMAGE .最後一道指令就是上傳了
上傳 Image 到 Docker Hub
由於上傳到 Docker Hub,需要登入帳號密碼,而 Travis 提供兩種方式讓開發者設定 Private global value,你不會想把帳號密碼用明碼方式寫在.travis.yml
吧。在早期 Travis 只提供一種方式就是透過 travis
指令來新增,詳細指令可以參考這文件,這邊就不教大家指令了,而另一種方式就是到 Travis 管理頁面直接進到 settings 設定即可
將帳號密碼設定完成後,請在 after_success
加上上傳指令
after_success: - if [ "$TRAVIS_BRANCH" == "master" ] && [ "$TRAVIS_GO_VERSION" == "1.7.1" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"; make docker_deploy tag=latest; fi上面表示只要是
master
分支,測試環境為 Golang 1.7.1 且不是在 Pull Request 狀態就執行登入,並且上傳,其中 make docker_deploy tag=latest
代表意思如下 (我把指令寫在 Makefile 內):
docker tag $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE):latest $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE):$(tag) docker push $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE):$(tag)上面步驟完成,之後只要 commit 到主分支,Travis 就會自動編譯 Image 並且上傳到 Dokcer Hub,蠻方便的。