Dockerfileの書き方や紛らわしいコマンドの話
RUNの使い方
可読性を損ねない範囲で、なるべく一つのRUN
で続けて書く。
最初にset -ex
をつけると、ビルド状況が出力され、途中でエラーが起きた場合はそこで止まる。
極力cd
は使わない。パスでアクセスし、必要ならWORKDIR
に絶対パスを指定して移動する。
複数モジュールインストールする場合は一行ずつ分けて、アルファベット順に並べておくのがいい。追加削除がしやすく、重複も防げる。
RUN set -ex && \
yum -yq install \
clock \
gcc \
make
ENVと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 param2
Dockerfileに
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に書く。
間違っていたら教えてくれるとありがたいです。
参考サイトは以下。