Dockerfileの書き方や紛らわしいコマンドの話



Page content

CodeCampGATE
CodeCampGATE

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時のプロセスを指定する方法は以下の二つ。

  1. docker run {image} command param1 param2

  2. DockerfileにENTRYPOINT ["command", "param1", "param2"]を記載

ちなみにこの二つが競合した場合は、ENTRYPOINTが優先される。

ただし、docker run {image} --entrypoint commandENTRYPOINTを上書きすることもできる。


CMDは上記のデフォルト値指定

CMDは、docker run {image}に続く入力のデフォルト値を指定しているだけ。

デフォルトなので、docker run {image}の後にコマンドを指定すればそちらが優先される。

  1. docker run {image}

    CMD ["command","param1","param2"]

    ENTRYPOINTとの併用もできるが、コマンドはENTRYPOINTのものが最優先で実行される。

    その場合、ENTRYPOINTに指定された内容の追加引数、のデフォルト値となる。

  2. 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に書く。


間違っていたら教えてくれるとありがたいです。

参考サイトは以下。