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回限りのバイナリを削除すると、最終的なイメージをスリム化するのに役立ちます。