Go1.11でのDockerの設定

golangも気づけばv1.11.5になっていまして、昔使ってたDockerfileのままでは動かなくなってるものなどがありました。

なので備忘録としてDockerfileの設定を載せておきます。

もし、こんなやり方があるよというのがあれば是非コメントしていただきたいです。


本番用

以下のような感じになります。


Dockerfile

FROM golang:1.11 AS builder

ENV CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64 \
GO111MODULE=on

COPY go.mod go.sum /
RUN go mod download

WORKDIR /go/src/github.com/path/to/project
COPY . .

RUN go build -o app

FROM alpine

COPY --from=builder /go/src/github.com/path/to/project/app /app

EXPOSE 8080
ENTRYPOINT ["/app"]


multi stage buildをしています。

これによって最終的なイメージサイズがかなり小さくなります。

重要な部分は

ENV GO111MODULE=on

COPY go.mod go.sum /
RUN go mod download

上の部分です。先にgo mod downloadをすることでキャッシュが効かせられるので、新しい必要なライブラリが無ければgoファイルの変更後のビルドの時間を短縮することが出来ます。

COPY go.mod go.sum /をするためには予めローカルでgo.modとgo.sumを作っておく必要があります。


bash

$ go version

go version 1.11.5
$ export GO111MODULE=on
$ go mod init
$ go mod download

go.mod go.sumが作成されると思います。


開発環境用

一応開発環境用の設定も載せておきます。


Dockerfile

FROM golang:1.11

ENV GO111MODULE on

COPY go.mod go.sum /

RUN go mod download && \
go get github.com/oxequa/realize

WORKDIR /go/src/github.com/path/to/project
COPY . .

CMD realize start --run


開発時にはoxequa/realizeを使ってます。

realizeはGoのファイルの変更を感知して、リロードしてくれるライブラリです。Dockerでやるにはvolumeをするのを忘れないでください。


bash

$ docker run -v $PWD:/go/src/github.com/path/to/project image名


ちなみにpilu/freshというライブラリもあります。

その場合は、上のDockerfileの該当箇所を合わせて直してください。