🐡

Dockerのマルチステージビルド

2023/07/26に公開

マルチステージビルドとは

DockerfileのFROMを複数書く
FROMがひとつのステージといった感じ

利点

マルチステージビルドを行うことによって、イメージのサイズを小さく抑えることができる
Dockerfileが読みやすくなる

マルチステージビルド以前のDockerfile

FROM gcc:12.2.0
WORKDIR /app
COPY ./hello.c .
RUN gcc hello.c
CMD ["./a.out"]

コンパイラがイメージに含まれてしまうため、イメージサイズが大きくなる

マルチステージビルドのDockerfile

FROM gcc:12.2.0
WORKDIR /app
COPY ./hello.c .
RUN gcc hello.c

FROM ubuntu:20.04
WORKDIR /app
# 0番目のステージからこのステージへコピーできる
COPY --from=0 /app/a.out .
CMD ["./a.out"]

コンパイラがイメージに含まれていない

作成したDockerイメージ

ビルドステージの命名

AS を使うことでステージに名前をつけられる

# このステージをcompilerと命名する
FROM gcc:12.2.0 AS compiler
WORKDIR /app
COPY ./hello.c .
RUN gcc hello.c

FROM ubuntu:20.04
WORKDIR /app
# compilerステージからこのステージへコピーできる
COPY --from=compiler /app/a.out .
CMD ["./a.out"]

ビルドステージの指定

イメージのビルド時にtargetでステージを指定することができる

docker build --target compiler .

複数環境向けイメージの作り方

# 開発・本番環境の共通
FROM ubuntu:20.04 AS base
RUN apt update
CMD ["sh", "-c", "echo My name is $my_name"]

# 開発環境
FROM base AS devel
ENV my_name=TEST

# 本番環境
FROM base AS prod
ENV my_name=Bob

targetで環境を指定する

# 開発環境
docker build --target devel .
# 本番環境
docker build --target prod .

Discussion