dockerfileベストプラクティス


一般ガイドと推奨事項
1、.dockerignoreファイルを使用する場合は、以前からdockerfileを空のディレクトリに配置して、そのディレクトリに必要なファイルを追加したほうがいいです.構築のパフォーマンスを向上させるために、.dockerignoreを追加することで、どのように.dockerignoreファイルを作成するかを排除することができます.このドキュメント.dockerignore 2を参照して、不要なファイルパッケージをインストールしない3、各コンテナは、1つの機能4のみを実装し、レイヤ5を最小化し、複数行のパラメータをソートする必要があります.
RUN apt-get update && apt-get install -y \
  bzr \
  cvs \
  git \
  mercurial \
  subversion

6、キャッシュの構築
dockerfile構造
1、fromは公式ライブラリをベースミラーとして使用し、debianミラーを使用することを提案します.彼はミラーを最小限に抑え、完全なリリース版であるためです.2、lableはlableを追加することで、プロジェクトに基づいてミラーを組織し、ライセンス情報を記録し、自動化を助けることができる.ミラーを設定するメタデータ情報LABEL命令は、ミラーにいくつかの記述を追加するメタデータを有する.LABELは、labelごとにLABLEフラグで行を開始し、1つ以上のキー値ペアを追加する形式の一連のキー値ペアです.たとえば、次のようになります.
# Set one or more individual labels
LABEL com.example.version="0.0.1-beta"
LABEL vendor="ACME Incorporated"
LABEL com.example.release-date="2015-02-12"
LABEL com.example.version.is-production=""

# Set multiple labels on one line
LABEL com.example.version="0.0.1-beta" com.example.release-date="2015-02-12"

# Set multiple labels at once, using line-continuation characters to break long lines
LABEL vendor=ACME\ Incorporated \
      com.example.is-beta= \
      com.example.is-production="" \
      com.example.version="0.0.1-beta" \
      com.example.release-date="2015-02-12"

docker inspectコマンドでは、ミラー内のラベル情報を表示できます.
3、runミラーファイルをより読みやすく、理解しやすく、メンテナンス性を向上させるために、反スラッシュで区切られた複数行でRUN文または複雑なRUN文を分割し、常にパッケージの更新とインストールコマンドを同じ文に結合することができます.異なるコマンドを同じコマンドに結合することが望ましい
RUN apt-get update && apt-get install -y \
    aufs-tools \
    automake \
    build-essential \
    curl \
    dpkg-sig \
    libcap-dev \
    libsqlite3-dev \
    mercurial \
    reprepro \
    ruby1.9.1 \
    ruby1.9.1-dev \
    s3cmd=1.1.* \
 && rm -rf /var/lib/apt/lists/*

4、cmd CMD命令は他のパラメータとともにミラー内のソフトウェアコンテナを実行するために使用されるべきであり、CMDの多くはこのようにCMD["executable"、"param 1"、"param 2"...]を使用し、cmdすなわちコンテナが走り出したときに実行される命令5、exposeはコンテナ内のポートを露出する.6、env新しいソフトウェアをより便利に動作させるために、ENVコマンドを使用してPATHの環境変数を更新することができます.例えば、ENV PATH/usr/local/nginx/bin:$PATHを定義してからCMD["nginx"]の正常な動作を確保することができます.最後に、ENVはバージョン変動を防ぐために共通のバージョン番号を設定することもできます.
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

7、add or copyはADDとCOPYが機能的に似ているが、一般的にCOPYが好ましい.それはADDよりも透明だからです.COPYは、ローカルファイルを基本的にコンテナにコピーすることのみをサポートしているが、ADDは、ローカルtar抽出およびリモートURLサポートのみなどのいくつかの機能を有しており、これらの機能は明らかではない.従って、ADDの最適な用途は、ADD rootfs.tar.xz/に示すように、ローカルtarファイルを画像に自動的に抽出することである.
コンテキスト内の異なるファイルを使用する複数のDockerfileステップがある場合は、一度にコピーするのではなく、個別にコピーします.これにより、各ステップのコンストラクションキャッシュが特定の必要なファイル変更時にのみ失効することが保証されます(強制的に再実行されます).
COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/

RUNステップのキャッシュ失効回数は、COPYを配置するよりも少ない./tmp/以前.
画像サイズが重要なので、ADDを使用してリモートURLからパケットを抽出しないことを強くお勧めします.代わりにcurlやwgetを使うべきです.これにより、抽出後に不要になったファイルを削除したり、画像に他のレイヤーを追加したりする必要がなくなります.たとえば、次のことを避けるべきです.
ADD http://example.com/big.tar.xz /usr/src/things/
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things all

君はそうすべきだ
RUN mkdir -p /usr/src/things \
    && curl -SL http://example.com/big.tar.xz \
    | tar -xJC /usr/src/things \
    && make -C /usr/src/things all

8、entrypoint ENTRYPOINTの最適な用途は、ミラーのメインコマンドを設定し、そのミラーをコマンドのように実行できるようにすることです(その後、デフォルトフラグとしてCMDを使用します).ENTRYPOINTコマンドは、アシストスクリプトと組み合わせて使用してもよく、ツールを起動するのに複数のステップが必要であっても、上記のコマンドと同様に実行できるようにしてもよい.ENTRYPOINTはコマンドエントリで、コンテナの実行時にパラメータを入力できます.9、volume VOLUMEコマンドはdockerコンテナによって作成されたデータベースストレージ領域を公開し、ストレージまたはファイル/フォルダを構成するために適用されます.VOLUMEは、ミラーの任意の可変部分および/またはユーザー修理可能部分に使用することを強くお勧めします.10、user sudoのインストールまたは使用は避けるべきです.それは予測不可能なTTYと信号転送動作を持っているため、それより多くの問題を解決する可能性があります.sudoのような機能が絶対必要な場合(たとえば、rootとしてデーモンプロセスを初期化し、root以外で実行する場合)、gosuを使用します.11、workdirは作業ディレクトリを指定します.明確で信頼性が高いために、WORKDIRの絶対パスを常に使用する必要があります.また、RUN cdのように命令を急増させるのではなくWORKDIRを使用する必要があります...&do-something、これらの命令は読みにくく、トラブルシューティング、メンテナンスが困難です.12、onbuildは現在のDockerfile構築が完了した後、ONBUILDコマンドを実行する.ONBUILDは、現在の画像から派生した任意のサブ画像で実行される.ONBUILDコマンドは、親Dockerfileが子Dockerfileに与えるコマンドとみなされます.