Dockerfileの書き方や紛らわしいコマンドの話
RUNの使い方
可読性を損ねない範囲で、なるべく一つのRUNで続けて書く。
最初にset -exをつけると、ビルド状況が出力され、途中でエラーが起きた場合はそこで止まる。
極力cdは使わない。パスでアクセスし、必要ならWORKDIRに絶対パスを指定して移動する。
複数モジュールインストールする場合は一行ずつ分けて、アルファベット順に並べておくのがいい。追加削除がしやすく、重複も防げる。
RUN set -ex && \
yum -yq install \
clock \
gcc \
makeENVとARG(とRUN)
ENV, ARG, RUNで変数に値を代入できる。
ENV VAR1 "hoge"
ARG VAR2="fuga"
RUN export VAR3="piyo"ENVで環境変数に設定、runした後のコンテナ内でも使える。利用用途はPATHなど。
ARGはビルド時のみ有効。モジュールのバージョンなど、ビルド時しか使わない変数はARGを使う。
(ただし、ARGに設定した内容はdocker historyで確認できるので、公開すべきでない情報は扱わない。)
RUNで設定した変数は、同一のRUNの中でしか扱えない
※ Dockerfileで、コマンドの実行結果を変数に格納することは(基本的に)できない。
ADDとCOPY
ADDはtarやgzを解凍して配置したり、リモートから追加する等の機能がある。
ただコピーしたいだけならCOPYを使う。
ADD add.tar /tmp
COPY copy.zip /tmp※ zipはADDでも解凍してくれないらしい
CMDとENTRYPINT
それぞれdocker runの時に実行するプロセスを指定する。
使い方が似ているけど意味合いはかなり異なるみたい。
docker run commandとENTRYPOINT[“command”]
CMDのことは忘れて、run時のプロセスを指定する方法は以下の二つ。
docker run {image} command param1 param2Dockerfileに
ENTRYPOINT ["command", "param1", "param2"]を記載
ちなみにこの二つが競合した場合は、ENTRYPOINTが優先される。
ただし、docker run {image} --entrypoint commandでENTRYPOINTを上書きすることもできる。
CMDは上記のデフォルト値指定
CMDは、docker run {image}に続く入力のデフォルト値を指定しているだけ。
デフォルトなので、docker run {image}の後にコマンドを指定すればそちらが優先される。
docker run {image}CMD ["command","param1","param2"]ENTRYPOINTとの併用もできるが、コマンドはENTRYPOINTのものが最優先で実行される。その場合、
ENTRYPOINTに指定された内容の追加引数、のデフォルト値となる。Dockerfileに
ENTRYPOINTを記載ENTRYPOINT ["command", "param1"] CMD ["param2"]
以下の例だと、docker run {image}でrunすると、command --helpが実行される。
一方、docker run {image} --buildでrunすると、command --buildが実行されることになる。
ENTRYPOINT ["command"]
CMD ["--help"]FROM
ベースイメージは極力公式のものを使う。
ちょっとした環境なら軽量のalpineをベースとしたイメージを使う。
(複雑になってくるとapkで取れるバージョンが古かったり、何かしらで詰まって諦めることが多い気がします。)
ファイル構成
Dockerfileの同階層以下には、必要なものを除き、極力ファイルを配置しない。
Dockerfile用のディレクトリを一つ掘って置いておく。
それが無理なら.dockerignoreに書く。
間違っていたら教えてくれるとありがたいです。
参考サイトは以下。



