web-dev-qa-db-ja.com

1つのコマンドで複数のディレクトリをコピーする

1つのコマンドで複数のディレクトリをコピーして、レイヤーの数を減らす方法はありますか?たとえば、次の代わりに:

COPY dirone ./dirone
COPY dirtwo ./dirtwo
COPY dirthree ./dirthree

私はやってみたいです:

COPY dirone/ dirtwo/ dirthree/ ./

ただし、これはディレクトリのcontentsをコピーしますが、ディレクトリ自体をコピーします。

31
Claudiu

これは、コピーコマンドの文書化された動作です。

<src>はディレクトリであり、ファイルシステムのメタデータを含むディレクトリの内容全体がコピーされます。

注:ディレクトリ自体はコピーされず、その内容だけがコピーされます。

最善の回避策は、ビルドフォルダーのディレクトリレイアウトを変更し、3つのフォルダーを1つの親フォルダーの下に移動して、親を追加することです。

18
BMitch

BMitchが答えた のように、それはCOPYの振る舞いが期待されています。

代替手段は ADD tarballの内容です。

初期tarballを作成します

tar -cvf dirs.tar dirone/ dirtwo/ dirthree/

ビルドに追加する

FROM busybox
ADD dirs.tar /
CMD find /dirone /dirtwo /dirthree

Tarballは自動的に抽出されます

○ →docker run c28f96eadd58
/dirone
/dirone/one
/dirtwo
/dirtwo/two
/dirthree
/dirthree/three

tarファイルを更新するたびに、そのステップのDockerビルドキャッシュが無効になります。多数のファイルを処理している場合、tar -cを実行するタイミングを賢くしたいかもしれません。 tarballから自動的に削除されないファイルを処理できる場合は、tar -uを使用することもできます。

[ -f dirs.tar ] && tar -uf dirs.tar something || tar -cf dirs.tar something
9
Matt