🐡
Dockerのマルチステージビルド
マルチステージビルドとは
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"]
コンパイラがイメージに含まれていない
ビルドステージの命名
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