Building Docker Images with heroku.yml Is Generally Available | Heroku
表題と記事の通りですが、heroku.ymlからDocker ImageのビルドがGAになりました。Heroku CI以外からのCI連携等がやりやすくなったように感じ、個人的にこれは嬉しい機能です。今回はGoでサンプルアプリを作りながら説明していきたいと思います。
構成
- Go v1.11 (Go Modules)
- Runtime Image - Distroless
- Server - Heroku
ガーッと適当なコードを用意。
package main
import (
"net/http"
"os"
"github.com/labstack/echo"
)
func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, 世界")
})
e.Logger.Fatal(e.Start(":" + os.Getenv("PORT")))
}
direnvを利用してGO111MODULE=on
にする。
export GO111MODULE=on
export PORT=1323
$ direnv allow .
direnv
を有効にし、試しにビルド。
$ go run main.go
依存ライブラリがダウンロードされ、 localhost:1323
で Hello, 世界 が表示されれば完了。
Dockerfile準備
Dockerfile準備
#build stage
FROM golang:1.11.1-stretch AS builder
WORKDIR /go/src/app
COPY . .
ENV GO111MODULE=on
RUN go build -o server
#final stage
FROM gcr.io/distroless/base
COPY --from=builder /go/src/app/server /app
ENV PORT=${PORT}
ENTRYPOINT [ "/app" ]
CMD [ "/server" ]
Docker multi-stage Build を使い、ビルド用イメージとランタイム用イメージを分けます。Goは特定のVMや言語ランタイムが不要なので本当にコンテナ技術と相性が良いですよね。
上記のDockerfileが出来たら、試しにローカルでイメージをビルドしてみましょう。イメージ名は適当に heroku-yml-example
としました。
$ docker build -t heroku-yml-example .
Step 1/11 : FROM golang:1.11.1-stretch AS builder
---> be13d0c67b75
...
Successfully tagged heroku-yml-example:latest
Successfully
の下りがでたら、次のコマンドでコンテナを起動します。
$ docker run -e PORT=1323 -p 1323:1323 --rm heroku-yml-example
これで localhost:1323
が起動し、アクセス出来たらコンテナ起動成功です。 Ctrl + C
で抜けて下さい。
Herokuへデプロイ
前置きが少々長くなりましたが、いよいよherokuにコンテナをデプロイです。まずはherokuにアプリケーションを作りましょう。
$ heroku create
お次が大事なコマンドです、 stackをcontainerに指定します。
$ heroku stack:set container
最後に heroku.yml
の記述です、heroku.ymlから出来ること一覧はこちらから見て下さい。
Dockerイメージでも、通常のBuildpackベースでもどちらもheroku.ymlは利用可能なようです(流し読みしましたが、なかなか便利。)
今回はHeroku側で行うDocker Buildに利用するDockerファイルの指定、web Dyno実行時のコマンド指定のみを行う最小構成です。
build:
docker:
web: Dockerfile
run:
web: /server
さて、ここまで出来たらいつもどおりの commit & push
$ git add .
$ git commit -m 'hogehoge'
$ git push heroku master
するとデプロイログには、、、
remote: === Building web (Dockerfile)
remote: Sending build context to Docker daemon 8.192kB
...
remote: Verifying deploy... done.
といった形でDocker Buildが行われている様子がわかります!
これで成功です。最後にheroku open
をしてアプリケーションを開いたら、ローカル時と同じように Hello, 世界 が表示されるはずです。
また、Herokuにログインし、ダッシュボードからSettingsを見てみると、
Infoの項目はStack container
となっています。
これで一通り完了とします。
最後に
いかがでしたでしょうか。Heroku.ymlとDocker BuildにHerokuが対応したとなると、益々Herokuが使いやすくなりそうです。
また全てをDockerベースにすることでマルチクラウド化も容易になりそうです。
お読み頂き有難うございました。