LoginSignup
7
13

More than 5 years have passed since last update.

heroku.ymlからDockerビルドが可能になった

Posted at

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

ガーッと適当なコードを用意。

main.go
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:1323Hello, 世界 が表示されれば完了。

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実行時のコマンド指定のみを行う最小構成です。

heroku.yml
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 となっています。
7F8AF03F-DDA3-4C47-AFCE-5E09654B6B90.png

これで一通り完了とします。

最後に

いかがでしたでしょうか。Heroku.ymlとDocker BuildにHerokuが対応したとなると、益々Herokuが使いやすくなりそうです。
また全てをDockerベースにすることでマルチクラウド化も容易になりそうです。

お読み頂き有難うございました。

7
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
13