web-dev-qa-db-ja.com

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

次のDockerfileは4つのCOPY層を含みます。

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

代わりに1つのレイヤーを使ってこれらのファイルをコピーするにはどうすればいいですか?次のことが試みられました。

COPY [
    "__BUILD_NUMBER ./",
    "README.md ./",
    "gulpfile ./",
    "another_file ./",
]
167
kazhuravlev
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になるようにビルドコンテキストを設定する必要があります。

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

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

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

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

22
stofstik

単純な

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

のドキュメントから

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

6
Edwin Ikechukwu

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

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

Docker CLIは、コンテキストをdockerデーモンに送信する前に、コンテキストのルートディレクトリで.dockerignoreという名前のファイルを探します。このファイルが存在する場合、CLIはコンテキストを変更して、そのパターンに一致するファイルとディレクトリを除外します。これにより、サイズの大きいファイルや重要なファイルやディレクトリを不必要にデーモンに送信したり、ADDやCOPYを使用してそれらを画像に追加したりするのを防ぐことができます。

0
Aaron