🐡

Dockerfileのベストプラクティス

に公開

※現在、ブログ移行中につき、こちらの記事は2024年10月に書いたものになります。

AWS Partner向けのトレーニングコース:Containers on AWSに参加しました。
Dockerfileの書き方について詳しく教えていただけたので学習メモとして投稿します。

そもそもDockerfileとは

コンテナイメージの設計図

図は講習資料からお借りしました。
左図がサンプルDockerfile  右図がコンテナのイメージ

FROMdocker build コマンドで必要となる、カスタムイメージ。ベースとなるイメージ
RUN: イメージ内で実行したいコマンド
EXPOSE:公開するポート
ADD:ローカルもしくはリモートからファイルをコピーする。どこかからファイルをコピーしてコンテナイメージの中に入れる。
CMD: コンテナ実行時に実行したいコマンドを書く。

コンテナのイメージは色々な層が重なってできています。
一つの命令が追加されるに従って層が一つ追加されていきます。
つまり、
左図が下↓に行くにしたがって、右図が下から上↑に、
ミルフィーユのようにレイヤーになって重なっていきます。

Dockerfileのベストプラクティス

RUNコマンド &&でつなげられるコマンドはつなげる。

docker buildコマンドを入力したときに表示される [1/5] ~ [5/5] が一つ一つのコマンドのレイヤーです。

RUN yum -y update && yum -y install httpd
&&がなくてもやっていることとしては同じですが、
&&でつながないとレイヤーが増えてしまいます。(レイヤーが [1/6] ~ [6/6] になる)
→ コンテナのイメージサイズが大きくなってしまい、pull や push の時間が長くなってしまいます。

※注意
RUNコマンドはまとめた方がレイヤーが薄くなりますが、以下のような場合はまとめてはいけません。

RUN chmod -v +x /run-httpd.sh http://run-httpd.shADD run-httpd.sh /run-httpd.sh より前にまとめてしまうと、そのファイルはありません、となります。

Dockerfileの中で変更があるものはなるべく後ろ(下)に記載する。

変更があった部分から先は cashが使えないため。(CASHEDの部分)

cashを使うことで、ビルド作業を短くする。

なるべく必要なものがすべてインストールされているベースイメージにする(FROM)

ビルドの効率的にもセキュリティ的にもよい

:latest ではなく具体的なバージョン番号が書かれている方がよい(FROM)

実行した時に依存してバージョンが左右されてしまう

参考リンク
Intro Guide to Dockerfile Best Practices

ADDではなくCOPYを使う

ADD は複数の機能(ローカル上での tar アーカイブ展開や、リモート URL のサポート)を持ち、一見では処理内容がわかりません。意図しない脆弱性を持ったものを持ってきてしまう恐れがあります。

参考リンク
Dockerfile を書くベスト・プラクティス

感想

意外と深く考えずにADDを使用していたりしていたので、きちんと参考リンク等に目を通してファイルを書こうと思います。

Discussion