クラウドとコンテナの基礎

FROM alpine
COPY data.tar.gz /tmp/
RUN tar -xzf /tmp/data.tar.gz -C /opt && rm /tmp/data.tar.gz

500 MBのアーカイブ data.tar.gz を展開するため、上のDockerfileでイメージを作った。展開の後で、同じ RUN の中でアーカイブを削除したのに、イメージの大きさはアーカイブの分だけ大きいままだった。理由と対策の組み合わせとして、最も適切なものはどれか。

  1. A&& のあとの rm はビルドのときには実行されないため。rm を別の RUN の命令に分けて書く
  2. B削除したファイルが、ビルドのキャッシュとしてイメージに残るため。docker build に --no-cache を付けてビルドし直す
  3. CCOPY の命令が作った層にアーカイブが残るため。マルチステージビルドで、展開したファイルだけを最終のイメージにコピーする
答えと解説を見る

正解:C. COPY の命令が作った層にアーカイブが残るため。マルチステージビルドで、展開したファイルだけを最終のイメージにコピーする

Dockerfileの命令のうち、ファイルシステムを変えるもの(COPY や RUN など)は、それぞれが1つの層になり、イメージはそれらの層を重ねたものです。後の層でファイルを削除しても、削除したという印が上の層に記録されるだけで、COPY の層に入った500 MBのアーカイブはイメージに残ります。マルチステージビルドで展開を別の段階で行い、展開したファイルだけを COPY --from で最後の段階に持ってくれば、アーカイブは最終のイメージに含まれません。ダウンロードと展開と削除を1つの RUN の中で行う方法もありますが、COPY で持ち込んだファイルには使えません。

  • A. && のあとの rm も同じ RUN の中で実行されます。別の RUN に分けると、削除の印の層が増えるだけで、大きさは減りません。
  • B. --no-cache は以前のビルドの結果を使い回さないようにするだけで、層の中身は同じなので、大きさは変わりません。
  • C. 正しい。削除しても下の層の中身は残るので、最終のイメージに入れないようにします。
この分野を解く 分野ページへ

クラウドとコンテナの基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

クラウドとコンテナの基礎のほかの問題

  1. 同じベースイメージ(120 MB)の上に、それぞれ固有の層を30 MBずつ重ねた5つのイメージがある。層の圧縮やメタデータの容量は考えないものとする。1台のサーバにこの5つのイメージをすべて取得(pull)したとき、イメージが使うディスクの容量として、正しいものはどれか。
  2. 上のDockerfileで、docker build でイメージを作るときに実行されるコマンドと、docker run でコンテナを起動するときに実行されるコマンドの組み合わせとして、正しいものはどれか。
  3. 上のDockerfileから作ったイメージ pinger を、docker run pinger example.com として起動した。コンテナの中で実行されるコマンドとして、正しいものはどれか。
  4. ポート80で待ち受けるWebサーバのイメージ nginx から、上のコマンドでコンテナを起動した。ホストのIPアドレスを 192.0.2.10 とし、ファイアウォールなどの制限はないものとする。同じネットワークにある別のPCのブラウザから、このWebサーバに接続するURLとして、正しいものはどれか。
  5. 上のDockerfile(B)は、COPY . . の後に RUN npm ci を置いていたDockerfile(A)を、依存関係のファイルだけを先にコピーする順序に変えたものである。npm ci には120秒、npm run build には30秒、COPY . . には2秒かかり、ほかの命令の時間は無視できるものとする。1日に20回、src の下のソースコードだけを変えて(package.json と package-lock.json は変えずに)イメージを作り直す。前回のビルドのキャッシュが使えるとき、1日のビルド時間の合計で、B が A より短くなる時間として、正しいものはどれか。