背景
Dockerのマルチステージビルド機能とDockerHubへのPushまでのメモ
用意するもの
- マルチステージビルドを用いたDockerfile
- => (sample) ryuichi1208/iniToJson
- DockerHubのアカウント
- => (sample) ryuichi1208/multi_stage_build
※ Docker 17.05以上が必要です。
Dockerfile
マルチステージを用いるDockerfileと使わないDockerfileを用意します。
マルチステージビルドについては下記をご参照ください
■ Use multi-stage builds
ノーマル
FROM golang:1.12.7-alpine
LABEL multi_stage="no"
WORKDIR /app
RUN apk add --no-cache make && \
rm -rf /var/cache/apk/* && \
mkdir src
COPY ./src ./src
COPY ./Makefile .
RUN make
ENTRYPOINT ["./main"]
CMD [""]
マルチステージビルド
FROM golang:1.12.7-alpine AS builder
LABEL multi_stage="no"
WORKDIR /app
RUN apk add --no-cache make && \
rm -rf /var/cache/apk/* && \
mkdir src
COPY ./src ./src
COPY ./Makefile .
RUN make
FROM busybox
LABEL multi_stage="yes"
WORKDIR /app
COPY --from=builder /app/main .
# COPY --from=0でも前ステージを指定してることになるのでそちらでも可能
COPY ./test.ini .
ENTRYPOINT ["./main"]
CMD [""]
上記をそれぞれビルドします。できあがったイメージはこちらです。
タグはわかりやすいようにつけてます。
353MB => 3MBは優秀ですね。
$ docker image ls --filter 'label=multi_stage=no'
REPOSITORY TAG IMAGE ID CREATED SIZE
ryuichi1208/mumulti_stage_build nomal 508808fe62ea 45 minutes ago 353MB
$ docker image ls --filter 'label=multi_stage=yes'
REPOSITORY TAG IMAGE ID CREATED SIZE
ryuichi1208/mumulti_stage_build multi b5c000ea4c0a About an hour ago 3.25MB
DockerHubへPush
DockerHubへログインしてpushします。
詳細については下記をご参照ください。
■ Docker Hub Quickstart
Pushしたものはこちら。
それぞれマルチステージビルドを使ったものと使わなかったイメージです。

他ホストからイメージしてRun
$ docker run ryuichi1208/multi_stage_build:multi
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ryuichi1208/multi_stage_build multi 27cb320e59ac 2 hours ago 3.25MB