Docker - カスタムイメージについて
はじめに
元気に再入門していきます。
Dockerfileとは
イメージをカスタマイズする方法です。Docker Hubからダウンロードしてきたイメージを、Dockerfileを使用してカスタマイズします。
CodeBuildを利用するときに指定するAMIがイメージなのであれば、Dockerfileはbuildspec.ymlに近いイメージなのかなと勝手に思っています。(多分厳密にはちょっと違います。)
技術の知識はないのに、AWSの知識だけ頭に詰め込んでいるとこういうときに困るよなぁといつも思っています。
Dockerfileの基本構文
FROM ubuntu
RUN apt update
COPY ./aaaaa.txt /
他にも色々
-
FROM: ベースとなるイメージを指定 -
RUN: コマンドを実行(例:RUN apt update) -
COPY: ファイルをコピー - 他にもいっぱいある
イメージのビルド
イメージをビルドする基本コマンドです。
docker image build docker-file/
-t オプションでタグを付けることもできます。
docker image build -t タグ名:バージョン名 docker-file/
ビルドコンテキストとは
コンテキストって他の場面でもちょくちょく出てくる英単語ですけど、いまいち意味がピンと来ませんよね。
なんとなく「そのものが動作する環境、状況を示すデータ群」みたいなイメージです。
Dockerにおけるビルドコンテキストとは何かというと、ビルドに必要な資材の集まり、みたいな意味になると思います。
docker image build docker-file/
だとすると、docker-file/ がそのままビルドコンテキストとなり、この内にdockerfileやその他必要なファイルを含めると、imageを構成する資材としてDockerがビルドしてくれるっていう流れですね。
ちなみに -f を使用すると、ビルドコンテキストとは別にDockerfileを指定することもできます。
docker image build -f docker-file/dockerfile .
ポイントとしては、Dockerfile内で COPY などでファイル操作を行おうとした場合は、ビルドコンテキストに含まれているファイルのみ参照できるということですね。
CMDコマンド
CMD ["実行コマンド", "パラメータ", "パラメータ"]
コンテナ起動時に実行されるコマンドを指定します。docker container run -it イメージ名 pwd で指定していた末尾のコマンドをDockerfile内にあらかじめ書いておけるって感じですね。
レイヤーの概念
Dockerfileに記載した1行ごと(1命令ごと)に変更差分のレイヤーが積み重なります。なので && とかでRUNの中で実施される内容を詰め込めばレイヤーは少なくすむ(イメージの容量も小さくて済む)のですが、ビルドにはキャッシュがあるので、レイヤーが細かく分割されていると後から変更したときにビルドが軽くなります。
レイヤーを分けた場合:
これを
RUN aaaaa
RUN bbbbb
RUN ccccc
こうすると、"ZZZZZ" だけの実行で済みます(キャッシュが効く)。
RUN aaaaa
RUN bbbbb
RUN ccccc
RUN "ZZZZZ"
レイヤーをまとめた場合:
これを
RUN aaaaa && bbbbb && ccccc
こうすると、 aaaaa && "ZZZZZ" && bbbbb && ccccc が全て実行されるから大変だよねって話です。
RUN aaaaa && bbbbb && ccccc && "ZZZZZ"
ちなみにキャッシュはファイル単位ではなく、命令の文字列単位で残るので、別の名前のDockerfileを使用した場合でも残ります。
環境変数の設定
ENV命令
以下のように環境変数を指定することができます。これは直感的で良いですね。
ENV hello="Hello World"
ENV hoge=hogehoge
ARG命令
イメージ作成時のみ有効な変数を指定する場合は、以下を使用します。
ARG hello="Hello World"
イメージビルド時に変数を渡すには --build-arg オプションを使用します。
docker image build --build-arg message="aaa aaaaa" -f DockerfileA -t 1123:4.0 .
作業ディレクトリの指定
作業ディレクトリを変更するときは、WORKDIR 命令を使用します。
WORKDIR /app/my_dir
例えば以下のようにすれば、my_dir 配下に hogehoge.txt が作成されます。
WORKDIR /app/my_dir
RUN touch hogehoge.txt
まとめ
- Dockerfileを使ってベースイメージをカスタマイズできる
- ビルドコンテキストはビルドに必要な資材の集まり
- Dockerfile内の命令は1行ごとにレイヤーとして積み重なる
- レイヤーの分け方はキャッシュの効率性とイメージサイズのトレードオフ
- キャッシュは命令の文字列単位で管理される
-
ENVで環境変数、ARGでビルド時変数を設定できる -
WORKDIRで作業ディレクトリを指定できる
何だかちょっとずつ複雑になってきましたね、、、、