ADD およびCOPY 2つの類似したDockerfile ビルド時にイメージにコンテンツを追加できるようにする手順。一方、 COPY コピー先への簡単なソース、 ADD アーカイブとリモートURLを操作するための追加機能が含まれています。
コピーコード> 2つの命令のうちのより単純なものです。ソースと宛先の2つの引数を受け入れます:
COPY example.txt /example/dir/example.txt
ソースパスは、Dockerホストからコンテナのファイルシステムにコピーされます。ビルドされたイメージには、指定された宛先パスにコピーされたファイルまたはディレクトリが含まれます。
コピーコード> すべてのファイルとディレクトリで機能しますが、ソースパスはアクティブなビルドコンテキスト内のパスに制限されます。 docker buildを実行するとコンテキストが設定されます :
docker build . # OR docker build /path/to/context
コンテナに宛先ディレクトリがまだ存在しない場合、この命令は自動的に宛先ディレクトリを作成します。末尾にスラッシュを含める場合( / )、Dockerは宛先をディレクトリとして扱い、その中にソースファイルを配置します。
*。jpgなどのワイルドカードを使用できます ファイルのセットと一致するソースパスの宛先。これらの式は、Go filepathを使用して解析されます マッチャー。
コピーされたファイルのUIDとGIDはデフォルトで0です。これは、オプションの-chownを使用してカスタマイズできます。 UID、GID、および名前を受け入れるフラグ。 chownを実行します コピーされたファイルがコンテナ内に入ると、次のようになります。
COPY --chown=my-user:my-group example.txt /example.txt
コピーコード> -fromもサポートします 国旗。これにより、ソースパスが変更されて別のを参照します。 ローカルビルドコンテキストの代わりに、コンテナイメージ。また、マルチステージビルドと連携して、以前のビルドステージで作成されたアーティファクトを取り込みます。
# Copies /usr/bin/composer from the composer:latest image COPY --from=composer:latest /usr/bin/composer /usr/bin/composer # Multi-stage build example # Stage 1: Copies example.scss from working directory into node:latest image # Stage 2: Copies example.css built in stage 1 into the final image (based on httpd:latest) FROM node:latest AS sass COPY example.scss . RUN npm install -g node-sass && node-sass example.scss example.css FROM httpd:latest COPY --from=sass /example.css example.css
-from フラグは、 Dockerfileの前半にリストされている名前付きステージを参照する必要があります 。一致するステージがない場合、Dockerは代わりにイメージを参照していると見なします。画像をプルできない場合は、ビルドエラーが発生します。
ADD COPYと同じ構文です 、送信元パスと宛先パスを受け入れます。 -fromはサポートされていません ただし、-chownを使用できます 。
COPYとは異なり 、 ADD リモートファイルのURLをダウンロードできます。パブリックにアクセス可能なURLをソースパスとして指定すると、そのファイルがダウンロードされ、コンテナイメージに追加されます。宛先パスの変更時刻( mtime )は、 Last-Modifiedの値に設定されます ダウンロードのHTTP応答のヘッダー。
ADD gzip、bzip2、xzで圧縮されたアーカイブを含むtarアーカイブを抽出することもできます。互換性のあるアーカイブをソースパスとして指定すると、その内容が指定されたコンテナディレクトリに解凍されます。ディレクトリの既存の内容は保持されます。
アーカイブの検出は、ファイル名や拡張子ではなく、実際のファイルの内容に基づいています。 .tar という名前を付けなくても、本物のアーカイブファイルを使用できます。 、 .tar.gz または.tar.xz 。
アーカイブを自動的に抽出する機能により、tarファイルとして配布されたソフトウェアパッケージをコンテナイメージに簡単に追加できます。 COPYへのtarパスを指定する 圧縮されたアーカイブファイルは、その内容ではなく、そのままコピーされます。 RUNを使用する必要があります ファイルを手動で解凍する手順。
COPY周辺の動作 ADDに適用 に。リモートURLを除いて、ソースパスはビルドコンテキストに存在する必要があります。コンテナの宛先パスは、Dockerのパス解決ルールを使用して存在しない場合、自動的に作成されます。
コピーコード> およびADD Dockerfile を作成するときに使用できる、密接に関連しているが明らかに異なる2つの命令です。 。それらの機能セットが重複しているため、デフォルトで使用するのに「最適」なのはどれか疑問に思われるかもしれません。
Docker独自のベストプラクティスガイドによると、 COPYにアクセスする必要があります ADDの追加機能が必要な場合を除きます 。 ADD コピープロセスに魔法を加える不透明な操作です。
ADDのみを使用 実際に必要な場合は、意図を伝えるのに役立ちます。そうしないと、チームメンバーが ADDを使用する習慣を身に付けるリスクがあります。 これは悲惨な結果をもたらす可能性があります。意図しないADDmy-archive.tar。 COPY my-archive.tarの代わりに アーカイブ自体ではなく、アーカイブのコンテンツがコンテナに表示されると、混乱やビルドの破損が発生する可能性があります。
ADDを使用するのが適切な場合も慎重に検討する必要があります リモートURLを使用します。 curlを使用する方が効率的です。 またはwget RUNを使用 これは、画像レイヤーのキャッシュを容易にするのに役立ちます。 ADD リモートURLのファイルが変更されると、命令は後続のすべてのビルドステージのキャッシュを常に無効にします。
可能な場合は、コピーしたファイルを使用後に削除することをお勧めします。ソフトウェアインストーラーをダウンロードまたは抽出する場合は、実行後に1回限りのバイナリを削除すると、最終的なイメージをスリム化するのに役立ちます。