Dockerfile命令
これらの推奨事項は、あなたが効率的かつ保守性Dockerfileの作成を支援するために設計されています。
から
可能な限り、基本イメージとして現在の公式画像を使用しました。お勧め、アルパインの画像を、それは厳密に制御し、小さいサイズ(現在は5未満MB)されているので、まだ完全なLinuxディストリビューションでありながら、。
タグ
あなたは、自動化したり、他の理由のために支援するためにライセンス情報を記録し、画像でプロジェクトを整理するためにあなたのイメージにタグを付けることができます。各ラベルについて、LABELは、キーの最初の一の以上の行を追加します。次の例では、許容可能な異なるフォーマットを示しています。説明のコメントを含みます。
あなたは、スペースで文字列を参照する必要がありますまたはスペースを逃れました。引用符(「)でエスケープする必要があります。
#は、1つ以上の個別のラベルを設定します。
LABELのcom.example.version = "0.0.1ベータ"
LABEL vendor1 = "ACME株式会社"
LABELのvendor2 = ZENITH \株式会社
LABELのcom.example.release-日付= "2015年2月12日"
LABELのcom.example.version.is生産= ""
画像は複数のラベルを持つことができます。ドッカー1.10の前に、追加の層の作成を防止するために、LABEL命令にすべてのラベルの組み合わせを示唆しました。これはもはや必要ではないが、それでも組み合わせタグをサポートしています。
#1行に複数のラベルを設定します
LABELのcom.example.version = "0.0.1ベータ" com.example.release-日付= "2015年2月12日"
上記のように書くこともできます。
#長い行を分割する行継続文字を使用して、一度に複数のラベルを設定します
LABELベンダー= ACME \株式会社\
com.example.isベータ= \
com.example.is生産= "" \
com.example.version = "0.0.1ベータ" \
com.example.release-日付= "2015年2月12日"
許容可能なラベルのキーと値に関するガイダンス、参照オブジェクトのラベルを理解します。クエリのラベルの詳細については、参照、管理オブジェクトタグろ過プロジェクトに関連付けられています。Dockerfile参照くださいLABELを。
RUN
あなたがより多く、読み、理解し、保守しDockerfileようにバックスラッシュで区切られた複数行の使用に分割長いまたは複雑な文を実行します。
APT-GETです
おそらく最も一般的なユースケースのRUNは、apt-getをアプリケーションです。それは、パッケージをインストールし、そのRUNのapt-getコマンドは、注意が必要ないくつかの問題があるため。
apt-getの親画像の多くの「基本」パッケージはにすることはできませんので、アップグレードとdist-upgradeのRUNを避け非特権血管アップグレード。パッケージに含まれている親画像の有効期限が切れている場合、その保守要員。あなたが特定のパッケージを知っている場合、fooは更新する必要がある、-y FOO自動的に更新をインストールapt-getを使用します。
常に同じ文の中でRUN apt-getの更新を兼ね備えています。たとえば、次のようにapt-getをinstallRUN
RUN apt-getを更新&& -yインストールapt-getを\
パッケージのバー\
パッケージバズ\
パッケージfooの
RUNでapt-getの更新文は単独のキャッシュの問題が発生し、その後のapt-getのインストールコマンドは失敗します。たとえば、あなたがDockerfileがあるとします。
UbuntuのFROM:18.04
apt-get updateを実行します
RUN -yカールをインストールapt-getを
画像、ドッカーキャッシュ内のすべてのレイヤを構築した後。後で追加の変更を加えることによって、パッケージをインストールapt-getを仮定します。
UbuntuのFROM:18.04
apt-get updateを実行します
RUNは-yカールnginxのインストールapt-getを
ドッカー最初の命令と、キャッシュされ、再利用前のステップと同じような修飾。その結果、中に更新apt-getのないコンパイラは、キャッシュされたバージョンを使用しているため、実行します。apt-getの更新が実行されていないので、おそらくあなたのビルドは、カールとnginxのパッケージの古いバージョンを取得します。
使用RUN apt-getを更新&& -yは、あなたのDockerfileがさらにコーディングまたは手動の介入なしに、パッケージの最新バージョンをインストール確保インストールapt-getを。この技術は、「キャッシュの破壊」と呼ばれています。また、キャッシュがパッケージ・バージョンを指定することで実装されてクリアすることができます。これは、例えば、固定されたバージョンと呼ばれています。
RUN apt-getを更新&& -yインストールapt-getを\
パッケージのバー\
パッケージバズ\
パッケージ-FOO = 1.3。*
バージョンに関係なく、キャッシュの内容のある、特定のバージョンを取得するために強制的に建物を固定しました。この技術はまた、誤って変更が生じた必要なパッケージに起因する障害を減らすことができます。
ここでは、よく構造化さRUNの説明は、すべてのapt-getの提言を示しています。
RUN apt-getを更新&& -yインストールapt-getを\
オンツール\
automakeに\
ビルド不可欠\
カール\
dpkgの-SIG \
libcap-devの\
libsqlite3-devの\
水銀\
reprepro \
ruby1.9.1 \
ruby1.9.1-devの\
s3cmd = 1.1。* \
&& RM -rfに/ var / lib / apt /リスト/ *
s3cmdパラメータは、バージョン1.1を指定します。*。画像は以前の古いバージョンを使用した場合は、新しいバージョン、キャッシュの破壊につながるapt-getを更新し、新しいバージョンをインストールすることを確認しますを指定します。各行は、重複パケットエラーを防止することができるパケットを示しています。
また、あなたはaptのキャッシュが層に格納されていないとして、画像サイズを小さくしますキャッシュに/ var / lib / apt /リストを削除することによって、それをきれいにする傾向があるとき。#apt-getの更新で始まるRUNステートメントので、そのため常にapt-getをさわやか前に、インストールパッケージキャッシュをリフレッシュします。
公式DebianとUbuntuの画像を自動的に実行-GET APTクリーン、明示的に呼び出す必要はありません。
パイプを使用します
(|)いくつかのRUNコマンドが使用パイプに依存して別のコマンドの機能は、次の例にコマンドの出力を渡します:
RUNのwgetの-O - https://some.site | トイレ-l> /数
使用ドッカー/ binに/ shの-cインタプリタは、コードインタプリタ出口導管が成功したかどうかを判断するためにのみ、最後の操作を評価し、コマンドを実行します。上記の例では、限りトイレ-lコマンドが成功したとしてもwgetのコマンドが失敗し、このステップはまた、構築に成功し、新たな画像を生成します。
あなたが何らかの段階でのパイプラインにコマンドをしたい場合はエラーで失敗しました、-o pipefailを事前に設定してください&&不注意によるビルド成功を防ぐために、予期しないエラーを識別します。例えば:
RUNは設定-o pipefail &&のwget -O - https://some.site | トイレ-l> /数
いないすべてのシェルがサポートしている-o pipefailのオプションを選択します。
Debianの画像に基づいて、このようなダッシュシェルの場合は、使用を検討して幹部のフォームがシェルpipefailオプションをサポートするための明確な選択を実行します。例えば:
RUNは、[ "/ bin / bash" と、 "-c"、 " - |トイレ-l> /数https://some.site -o pipefail &&のwget -Oを設定します"]
CMD
コマンドCMDが実行され、任意のパラメータを含むソフトウェアイメージに適用されます。CMDはほとんど常に使用CMD [ "実行"、 "PARAM1"、 "PARAM2" ...]の形式でする必要があります。画像はApacheやレールなどのサービスのために使用されている場合ので、あなたはCMD [「 - DFOREGROUND」「のapache2」、]のようなものを実行することができます。実際には、命令のこの形式は、任意の画像ベースのサービスのために推奨されます。
他のほとんどのケースでは、CMDは、bashの、PythonとPerlなど、インタラクティブシェルを与えるべきです。例えば、CMD [ "パール"、 " -de0"]、CMD [ "パイソン"]、 またはCMD [ "PHP"、 "-a "]。このフォームを使用して、同様の操作を実行するとき、あなたが使用する準備ができて利用できるシェル、中に配置されます-it pythonのドッキングウィンドウの実行を意味し使用してください。CMDはCMD [「PARAM」、「PARAMを使用することは非常にいくつかの方法でなければなりません 」] と連動してENTRYPOINTあなたとあなたの意図されたユーザがすでにどのようにENTRYPOINT作業に精通している場合を除き、。
EXPOSE
コマンドが接続を監視コンテナポートを示す公開します。そのため、あなたのアプリケーションのための一般的なレガシーデバイスを使用する必要があります。例えば、画像80が使用するApache Webサーバー、公開含まれており、MongoDBのは27017を公開使用、およびようになり、画像が含まれています。
外部からのアクセスの場合は、ユーザーがドッキングウィンドウを実行するためのフラグを実行して使用することができ、このフラグは、ポートへの彼らの選択をポートマッピングを指定する方法を示します。コンテナのリンクについて、ドッカーは、環境変数(すなわちMYSQL_PORT_3306_TCP)を提供するが、収納容器経路から元に戻されます。
ENV
それが簡単に新しいソフトウェアを実行するために作成するには、PATH環境変数ENVコンテナインストールされているソフトウェアを更新することができます。たとえば、ENVパスは/ usr / local / nginxの/ binに:$ PATHのCMD [ "nginxの"]仕事を確保します。
環境変数に対応するために必要なサービスを提供するために、あなたの願いに固有のENVの命令は、PostgresのPGDATAとしても有用です。
次の例に示すように最後に、ENVはまた、より簡単にメンテナンスリリースバンプのための一般的なバージョンを設定するために使用すること:
ENV PG_MAJOR 9.3
ENVのPG_VERSION 9.3.4
RUNカール-SL http://example.com/postgres-$PG_VERSION.tar.xz | タール-xJCは/ usr / src /はpostgress && ...
ENVのPATHは/ usr / local / postgres- $ PG_MAJOR / binに:$ PATHに
定数変数と同様の手順を使用して(ハードコードされた値と比較して)、このメソッドを使用すると、自動的にコンテナのソフトウェアバージョンを破壊するために、単一の魔法ENV命令を変更することができます。
各ENV行は、RUNコマンドのような新しい中間層を作成します。これは、あなたが将来の層に設定した環境変数をキャンセルした場合でも、それはまだこの層に残り、その値をダンプすることができます。あなたは、以下に示すDockerfileを作成することによって、それをテストし、それを構築することができます。
高山FROM
ENV ADMIN_USER = "マーク"
RUNエコー$ ADMIN_USER> ./mark
RUN解除ADMIN_USER
$]ドッキングウィンドウの実行--rmテストのsh -c 'エコー$のADMIN_USER'
マーク
これを防止するため、実際に解除環境変数、シェルコマンドでRUNコマンドを使用し、単層で設定するには、設定解除の変数とすべてを使用しています。あなたは使用することができ、または別のコマンド&&。あなたは第二の方法を使用し、1つのコマンドが失敗した場合は、ドッキングウィンドウのビルドが失敗します。これは通常は良いアイデアです。読みやすさを向上させることができます行継続文字として\ LinuxのDockerfilesを使用してください。また、シェルスクリプトにすべてのコマンドを使用して、シェルスクリプトを実行するために、RUNコマンドを聞かせすることができます。
高山FROM
RUN輸出ADMIN_USER = "マーク" \
&&ますecho $ ADMIN_USER> ./mark \
&&解除ADMIN_USER
CMD SH
$]ドッキングウィンドウの実行--rmテストのsh -c 'エコー$のADMIN_USER'
コピーを追加
一般的に、機能に追加して、同様のがCOPY、それは好ましいコピーです。それはより透明ADDであるためです。ADDは、いくつかの機能(たとえば、ローカルおよびリモートのタールエキスのURLのサポートなどが限定されている)がある一方、COPYは、コンテナにコピーされただけで、基本的なローカルのファイルをサポートし、これらの機能は明らかではありません。したがって、ローカルADDの最良の使用が自動的にそのような追加のrootfs.tar.xzの/ように、画像にtarファイルを抽出します。
あなたが別のファイルのコンテキストを使用して、複数のDockerfileの手順を使用している場合は、コピーし、彼らは一度だけであり、そしてません。これは、確実に特定の所望のファイルの変更にキャッシュのみ故障(強制再実行ステップ)の構成の各ステップ。
例えば:
COPY requirements.txtを/ tmp /
RUNは--requirement /tmp/requirements.txtをインストールするPIP
COPY。/ tmp /
RUNステップは、キャッシュが失敗回数が数前COPY。の/ tmp /キャッシュ無効に配置されているよりも少ないせます。
画像サイズが非常に重要であることから、ADD強くリモートでパッケージを取得するためにURLを使用しないことをお勧めします。代わりにカールやwgetのを使用する必要があります。この方法では、あなたはもはや抽出後に必要なファイルを削除することができ、画像内の他の層を追加する必要はありません。たとえば、次のようなことをやって避ける必要があります。
/ http://example.com/big.tar.xzは/ usr / src /物事を追加
RUNタール-xJf /usr/src/things/big.tar.xz -Cは/ usr / src /物事
RUNは、すべての-Cは/ usr / src /ものを作ります
しかし、のような何かをします:
RUNます。mkdir -pは/ usr / src /物事\
&&カール-SL http://example.com/big.tar.xz \
| タール-xJCは/ usr / src /物事\
&&作る-Cは/ usr / src /物事のすべて
他の項目(ファイル、ディレクトリ)の場合は、必ずコピーを使用する必要があり、自動抽出機能をADDtarする必要はありません。
ENTRYPOINT
ホストコマンドエントリポイントイメージの最良の使用は、実行コマンド(CMDは、デフォルトのフラグとして使用される)などの画像のイメージを可能に設けられています。
コマンドラインツールの例の画像s3cmdから始めましょう:
ENTRYPOINT [ "s3cmd"]
CMD [ "--help"]
今、あなたは、この画像のようにコマンドを実行するに役立ち表示することができます。
$ドッカ実行s3cmd
または正しいパラメータで実行します。
$]ドッキングウィンドウはs3cmdのLS S3を実行します:// mybucket
上記のコマンドに示すように、画像名は、基準バイナリとして働くことができるので、これは有用です。
エントリポイント命令はまた、ツールは複数のステップを必要とすることが開始されたとしても、それは上記のように類似したコマンドを実行することを可能にする補助スクリプトと組み合わせて使用することができます。
例えば、公式画像をPostgresの そのENTRYPOINTとして次のスクリプトを使用しました:
#!/ binに/ bashの
9月-e
[ "$ 1" = 'postgresの']であれば、それから
chownコマンドの-Rはpostgres "$ PGDATA"
[-z "$(lsの-A "$ PGDATA")"]の場合; それから
gosuのpostgresのinitdbを
されます
EXEC gosuのpostgresの "$ @を"
されます
幹部の "$ @"
アプリとして構成PID 1
このスクリプトは、使用していますexecbashコマンドを アプリケーションがこのアプリケーションは、任意のUnixのコンテナ受信した信号を送信することができます最終容器のPID 1を実行しているように、。詳細については、ENTRYPOINT参照を。
スクリプトがコンテナにコピーされているヘルプとENTRYPOINTコンテナで実行を開始します。
./docker-entrypoint.sh COPY /
ENTRYPOINT [ "/docker-entrypoint.sh"]
CMD [ "postgresの"]
このスクリプトは、複数のユーザがPostgresのと対話することができます。
これは単に、Postgresのを開始することができます。
$ドッキングウィンドウの実行のpostgres
また、サーバのPostgresにパラメータを実行し、合格するために使用することができます。
$ドッキングウィンドウの実行のpostgres postgresの--help
最後に、このようなバッシュのように完全に異なるツールを起動するために使用することができます。
$]ドッキングウィンドウの実行--rm -itのpostgresのbash
ボリューム
任意のデータベース格納領域は、ドッキングウィンドウコンテナまたはストレージ設定ファイル/フォルダが作成した開示されVOLUMEコマンドに適用されます。強くあなたが任意の変数および/またはユーザの画像VOLUME修理可能な部品を使用することをお勧めします。
ユーザー
サービスは、許可なしに実行できる場合は、root以外のユーザーを変更するにはUSERを使用してください。まず、作成ユーザーとグループは、&&のuseradd --no-ログのinit -r -gのpostgres postgresの中Dockerfileのようなものでgroupaddの-rはpostgresを実行します。
明示的に考えてみましょうUID / GIDを
「次」にかかわらず、画像再構成の、UID / GIDが割り当てられているため、画像のユーザーとグループは、非決定UID / GIDに割り当てられます。それが重要な場合したがって、あなたは明示的なUID / GIDを割り当てる必要があります。
ゴーアーカイブ/タールパッケージはスパースファイルを処理するので、未解決のエラーを / varは/ NULLで埋め/ faillog層コンテナのログを記録するので、\ 0(、ボリュームの枯渇につながる可能性がドッカーコンテナ内の非常に大きなUIDを持つユーザーを作成しよう)の文字。溶液はuseraddのために--no-ログINITフラグを渡すことです。Debianの/ Ubuntuのはadduserパッケージは、このフラグをサポートしていません。
なぜなら、その予測不可能な挙動TTY及び信号中継器の問題を引き起こすことができるインストールまたは使用を避け、須藤。あなたは絶対に同様の機能はsudoが必要な場合は、ルート以外のルートにそれを実行するためのデーモンを初期化し、例えば、使用することを検討してください「gosuを」。
最後に、減少させるために、レベルと複雑USERは、前後に頻繁な切り替えを避けます。
WORKDIR
明快さと信頼性のために、あなたは常に絶対パスWORKDIRを使用する必要があります。また、あなたはRUN CDの、トラブルシューティング、およびメンテナンス命令WORKDIRの増殖を読む... &&行う-何かをするのは難しい使用する必要があります。
ONBUILD
ビルドDockerfile現在の実行後ONBUILDコマンド。現在の画像からエクスポート任意のサブイメージを実行ONBUILD。ONBUILDコマンドはDockerfileの親が子供に指示Dockerfileを与えるとみなされます。
ドッカーがONBUILD任意のコマンドの子孫の前にDockerfileのコマンドを実行してビルドします。
与えられた画像のONBUILD写真はからビルドしようとするのに非常に有用です。たとえば、あなたが同じように、この言語で書かれたDockerfile任意のユーザのソフトウェアを構築するために、言語ONBUILDの画像スタックを使用していますルビーのONBUILD変異体である見ては。
例えば、マーキングONBUILD個体を得られる画像の構築:ルビー:1.9 onbuild又はルビー:2.0 onbuild。
追加またはONBUILDにCOPY、置くときは注意してください。リソース不足のコンテキストの新しい建物が追加されている場合は、「onbuild」の画像は、致命的なエラーになります。前述したように、別々のラベルを追加すると、選択したDockerfileを可能にすることによって、この状況を緩和するのに役立ちます。