cpコマンドで-r以外のoptionを付けずにディレクトリをコピーする際や、Dockerfile内でCOPYコマンドを使う際、環境やディレクトリ名に/を付けるか否かによって振る舞いが異なったので、備忘録的にまとめておきます。
- macOSのcpコマンド
- ubuntu linux (on Docker)のcpコマンド
- Dockerイメージビルド時のCOPYコマンド
について投稿者のmacbook上でのテスト結果をまとめたものになるので、もしかすると実際の挙動とは異なるところがあるかもしれません。
扱うパターンは以下の通りです。
# mac, ubuntu linux (on Docker)
cp -r dir1 dir2
cp -r dir1/ dir2
cp -r dir1 dir2/
cp -r dir1/ dir2/
# Dockerfile (dir2は既にコンテナ側に存在)
COPY dir1 dir2
COPY dir1/ dir2
COPY dir1 dir2/
COPY dir1/ dir2/
大元のディレクトリ構成は以下のようになっています。
├── dir1/
│ └── child_dir1/
└── dir2/
└── child_dir2/
cp元dirがcp先dirの子になるパターン
cp -r dir1 dir2
├── dir1/
│ └── child_dir1/
└── dir2/
├── child_dir2/
└── dir1/
└── child_dir1/
- ubuntu linux (on Docker)では必ずこうなる
- macOSではcp元ディレクトリ名に/を付けない時(
cp -r dir1 dir2もしくはcp -r dir1 dir2/とする場合)にこうなる
cp元dirの中身がcp先dirにコピーされるパターン
cp -r dir1 dir2 # macOSの場合
COPY dir1 dir2 # Dockerfileの場合
├── dir1
│ └── child_dir1/
└── dir2
├── child_dir1/
└── child_dir2/
- Dockerfile上のCOPYコマンドでは必ずこうなる
- macOSではcp元ディレクトリ名に/を付ける時(
cp -r dir1/ dir2もしくはcp -r dir1/ dir2/とする場合)にこうなる