クラウドとコンテナの基礎
FROM golang AS build
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -o /out/app .
FROM scratch
COPY --from=build /out/app /app
ENTRYPOINT ["/app"]scratch は、ファイルを何も含まない空のイメージである。上のマルチステージビルドのDockerfileで作った最終のイメージに含まれるものとして、正しいものはどれか。
- Abuild の段階で作った実行ファイル /app だけで、Goのコンパイラやソースコードは含まれない
- Bbuild の段階と最後の段階の層がすべて重なり、Goのコンパイラ、ソースコード、/app のすべてが含まれる
- C最初の FROM の golang イメージとソースコードだけで、/app はコンテナを起動するたびにビルドされる
答えと解説を見る
正解:A. build の段階で作った実行ファイル /app だけで、Goのコンパイラやソースコードは含まれない
マルチステージビルドでは FROM ごとに段階が分かれ、最終のイメージになるのは最後の段階だけです。前の段階はコンパイラなどを使って成果物を作るためのもので、COPY --from で指定したファイルだけが最後の段階に持ち込まれます。ここでは空の scratch の上に /app だけがコピーされるので、Goのコンパイラやソースコードを含まない小さなイメージになります。scratch には共有ライブラリもないので、CGO_ENABLED=0 でほかのライブラリに依存しない実行ファイルを作っています。含まれるものが少ないと、取得が速くなり、攻撃に使える道具や脆弱性の対象も減らせます。
- A. 正しい。最後の段階に COPY --from で持ち込んだファイルだけが残ります。
- B. 前の段階の層は最終のイメージに含まれません。最終のイメージは最後の FROM から作られます。
- C. 最終のイメージのもとは最後の FROM の scratch で、go build はビルドのときに1回だけ実行されます。