みなさま、こんにちは。石原です。本日AWS Partner向けのトレーニングコース:Containers on AWSに参加しました。Dockerfileの書き方について詳しく教えていただけたので学習メモとして投稿します。
そもそもDockerFileとは
コンテナイメージの設計図
図は講習資料からお借りしました。
左図がサンプルDockerFile 右図がコンテナのイメージ
FROM
:docker 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.sh
を ADD run-httpd.sh /run-httpd.sh
より前にまとめてしまうと、そのファイルはありません、となります。
DockerFileの中で変更があるものはなるべく後ろ(下)に記載する。
変更があった部分から先は cashが使えないため。(CASHEDの部分)
cashを使うことで、ビルド作業を短くする。
なるべく必要なものがすべてインストールされているベースイメージにする(FROM
)
ビルドの効率的にもセキュリティ的にもよい
:latest ではなく具体的なバージョン番号が書かれている方がよい(FROM
)
実行した時に依存してバージョンが左右されてしまう
参考リンク
Intro Guide to Dockerfile Best Practices
ADD
ではなくCOPY
を使う
ADD は複数の機能(ローカル上での tar アーカイブ展開や、リモート URL のサポート)を持ち、一見では処理内容がわかりません。意図しない脆弱性を持ったものを持ってきてしまう恐れがあります。
参考リンク
感想
意外と深く考えずにADDを使用していたりしていたので、きちんと参考リンク等に目を通してファイルを書こうと思います。