Dockerfileを使用して1つのレイヤーに複数のファイルをコピーする方法


245

次のDockerfile4つのCOPYレイヤーが含まれています。

COPY README.md ./
COPY package.json ./
COPY gulpfile.js ./
COPY __BUILD_NUMBER ./

代わりに1つのレイヤーを使用してこれらのファイルをコピーする方法は?以下が試されました:

COPY [
    "__BUILD_NUMBER ./",
    "README.md ./",
    "gulpfile ./",
    "another_file ./",
]

回答:


427
COPY README.md package.json gulpfile.js __BUILD_NUMBER ./

または

COPY ["__BUILD_NUMBER", "README.md", "gulpfile", "another_file", "./"]

ソースファイル仕様でワイルドカード文字を使用することもできます。詳細については、ドキュメントを参照してください

ディレクトリは特別です!あなたが書くなら

COPY dir1 dir2 ./

実際には

COPY dir1/* dir2/* ./

1つのコマンドで宛先ディレクトリーの下に複数のディレクトリー(内容ではない)をコピーする場合は、ソースディレクトリーが共通の親の下にあり、次にCOPYその親の下になるようにビルドコンテキストを設定する必要があります。


53
ソースがディレクトリの場合、これはディレクトリ自体ではなく、ディレクトリの内容をコピーすることに注意してください。
Claudiu

7
宛先ディレクトリが同じであることにも注意してください。宛先が異なるさまざまなファイルを多数実行する場合は、オーバーレイファイルシステム(chrootなど)を構築し、それをtarアーカイブにして、ADDで追加することを検討してください。
tu-Reinstate Monica-dor duh 2016年

4
@Claudiuフォルダ自体をコピーする方法は?
k0pernikus

5
@ k0pernikus COPY myDir1 ./MyDir1/
Manuel

@ manuel-manhartビルドパラメータを使用してファイルのリストをパラメータ化できるかどうか知っている人はいますか?github.com/moby/moby/issues/38532
Marcello de Sales

52
COPY <all> <the> <things> <last-arg-is-destination>

しかし、これはドキュメントからの重要な抜粋です:

コンテキストから異なるファイルを使用する複数のDockerfileステップがある場合は、一度にすべてではなく、それらを個別にコピーします。これにより、特に必要なファイルが変更された場合にのみ、各ステップのビルドキャッシュが無効化されます(ステップを強制的に再実行します)。

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#add-or-copy


「すべてのもの」をパラメータ化できるかどうか知っていますか??? ビルドパラメータを使用していますか?github.com/moby/moby/issues/38532 ???
Marcello de Sales

@MarcellodeSalesでは、なぜそれが必要になるのかわかりません。これらのファイルなしでベースイメージを作成してから、子イメージにコピー命令を含めないでください。パスを定義する必要がある場合でも、違いはほとんどありません。または、イメージから完全に除外して、コンテナにマウントすることもできます。そこに.envファイルがあり、これを構成できます。
Manuel Manhart

また、ファイルシステムは階層化されているため、既存のパスにいつでもコピーできます。ファイルシステムは階層化されているため、既存のコンテンツと重複またはシャドウされます。
Manuel Manhart

@ManuelManhart、私はONBUILD COPYを使用して動的パラメーター化画像を構築しています...プラットフォームの一部として、画像で実行する必要があることの複雑さを隠しているので、値を指定する必要がありますパラメータとして。
Marcello de Sales

@MarcellodeSalesこれは現在/まだサポートされているとは思わない。しかし、あなたが見る、それがカプセル化された持っているビルド引数を使用することができstackoverflow.com/questions/43654656/...
マヌエルManhart

7

簡単な

COPY README.md  package.json gulpfile.js __BUILD_NUMBER ./

文書から

直接またはワイルドカードの使用により、複数のリソースが指定されている場合は、ディレクトリである必要があり、スラッシュ/で終わる必要があります。


6

コピーしたくない.dockerignoreファイルを除外するために、ファイルを作成することもできます。

https://docs.docker.com/engine/reference/builder/#dockerignore-file

docker CLIは、コンテキストをdockerデーモンに送信する前に、コンテキストのルートディレクトリで.dockerignoreという名前のファイルを探します。このファイルが存在する場合、CLIはコンテキストを変更して、そのパターンに一致するファイルとディレクトリを除外します。これは、不必要に大きなファイルやディレクトリをデーモンに送信したり、ADDまたはCOPYを使用してそれらをイメージに追加したりする可能性を回避するのに役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.