次のDockerfile
は4つのCOPY
層を含みます。
COPY README.md ./
COPY package.json ./
COPY gulpfile.js ./
COPY __BUILD_NUMBER ./
代わりに1つのレイヤーを使ってこれらのファイルをコピーするにはどうすればいいですか?次のことが試みられました。
COPY [
"__BUILD_NUMBER ./",
"README.md ./",
"gulpfile ./",
"another_file ./",
]
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
になるようにビルドコンテキストを設定する必要があります。
COPY <all> <the> <things> <last-arg-is-destination>
しかし、これはドキュメントからの重要な抜粋です。
コンテキストとは異なるファイルを使用するDockerfileステップが複数ある場合は、それらをまとめてコピーするのではなく、個別にコピーします。これにより、特に必要なファイルが変更された場合にのみ、各ステップのビルドキャッシュが無効化されます(ステップが強制的に再実行されます)。
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#add-or-copy
単純な
COPY README.md package.json gulpfile.js __BUILD_NUMBER ./
直接またはワイルドカードの使用によって複数のリソースが指定されている場合は、ディレクトリでなければならず、スラッシュ/で終わる必要があります。
.dockerignore
ファイルを作成して、コピーしたくないしないファイルを除外することもできます。
https://docs.docker.com/engine/reference/builder/#dockerignore-file
Docker CLIは、コンテキストをdockerデーモンに送信する前に、コンテキストのルートディレクトリで.dockerignoreという名前のファイルを探します。このファイルが存在する場合、CLIはコンテキストを変更して、そのパターンに一致するファイルとディレクトリを除外します。これにより、サイズの大きいファイルや重要なファイルやディレクトリを不必要にデーモンに送信したり、ADDやCOPYを使用してそれらを画像に追加したりするのを防ぐことができます。