Dockerのマルチステージビルドで特定のステージを指定する方法

Dockerのマルチステージビルドで特定のステージを指定する方法

Dockerのマルチステージビルド(Multi-stage builds)で複数のステージを用意する場合があります。
マルチステージビルドを使うことで、一つのDockerfile内で複数のビルドステージを管理し、最終的なイメージサイズを小さく保つことができます。

今回はstaging, production環境でステージを分けてビルドしたいということがありました。 最初は複数のDockerファイルを用意しようと思いましたが、コピペの嵐になってメンテナンスが地獄になることが予想できていました…。

調べたところDocker Buildには --target オプションというものがあり、ステージを指定してビルドできます。
Specifying target build stage (–target)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# ビルド環境
FROM golang:1.13 AS build-env
WORKDIR /app
COPY . .
RUN go build -o myapp

# ステージング用環境
FROM alpine:latest as stg
WORKDIR /app

ENV API_URL 'https://polidog.jp/stg/api'

COPY --from=build-env /app/myapp .
CMD ["./myapp"]


# 実行環境
FROM alpine:latest as prod
WORKDIR /app

ENV API_URL 'https://polidog.jp/api'

COPY --from=build-env /app/myapp .
CMD ["./myapp"]

こんな感じのDockerfileがある場合に、ステージング環境のステージをビルドしたい場合は以下のようにします。

1
$ docker build --target stg -t myapp-build .

まじで知らなかった…。

カテゴリ

comments powered by Disqus