Dockerfileでイメージ内の既存ディレクトリ宛にADD/COPYした場合の挙動を調べた
- Docker Engine 24.0
Dockerイメージのビルド時に、イメージ内のディレクトリ構造に、同じディレクトリ構造をもつホスト側ディレクトリを追加した場合の挙動を確認したい。
cp -r
やrsync -a
のような挙動を期待するが、動作を検証してみた。
結果として、cp -r
やrsync -a
のように、既存のディレクトリ内容を維持して、新しいファイルを追加し、重複するファイルがあれば上書きする挙動をした。
ADDでファイルが重複しない場合
イメージ内に以下のようなディレクトリ構造を構築する。
- /hoge
- fuga
- piyo/
- hogera
RUN <<EOFset -eumkdir /hogetouch /hoge/fugamkdir /hoge/piyotouch /hoge/piyo/hogeraEOF
ビルドコンテキストディレクトリに以下のようなディレクトリ構造を構築する。
このディレクトリを先ほどのイメージ内の/hoge
にADDする。
- hoge/
- fugera
- piyo/
- hogerara
ADD ./hoge /hoge/
結果表示用のtreeコマンドをインストールするコマンドを加えて合わせると、以下のようなDockerfileになる。
# syntax=docker/dockerfile:1.6FROM ubuntu:22.04RUN <<EOFapt-get updateapt-get install -y \treeapt-get cleanrm -rf /var/lib/apt/lists/*EOFRUN <<EOFset -eumkdir /hogetouch /hoge/fugamkdir /hoge/piyotouch /hoge/piyo/hogeraEOFADD ./hoge /hoge/
docker build -t doco .docker run --rm -it doco
# tree /hoge/hoge|-- fuga|-- fugara`-- piyo|-- hogera`-- hogerara1 directory, 4 files
既存のディレクトリの内容を維持したまま、新しいファイルが追加される。
ADDでファイルが重複 する場合
先ほどのビルドコンテキストディレクトリにfuga
ファイルを追加して、以下のように適当な内容を記述する。
AAAAAAAAAAAAAAAAAAAAAAAAAAA
- hoge/
- fuga
- fugera
- piyo/
- hogerara
docker build -t doco .docker run --rm -it doco
# cat /hoge/fugaAAAAAAAAAAAAAAAAAAAAAAAAAAA
ファイルが重複する場合、上書きされる。
COPYの場合
Dockerfileを以下のように書き換える。
COPY ./hoge /hoge/
docker run --rm -it doco
# tree /hoge/hoge|-- fuga|-- fugara`-- piyo|-- hogera`-- hogerara1 directory, 4 files# cat /hoge/fugaAAAAAAAAAAAAAAAAAAAAAAAAAAA
ADDと同じく、既存のディレクトリ内容を維持して、新しいファイルを追加し、重複するファイルがあれば上書きされた。