golangも気づけばv1.11.5になっていまして、昔使ってた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を作っておく必要があります。
$ go version
go version 1.11.5
$ export GO111MODULE=on
$ go mod init
$ go mod download
でgo.mod go.sum
が作成されると思います。
開発環境用
一応開発環境用の設定も載せておきます。
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をするのを忘れないでください。
$ docker run -v $PWD:/go/src/github.com/path/to/project image名
ちなみにpilu/freshというライブラリもあります。
その場合は、上のDockerfileの該当箇所を合わせて直してください。