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
既存のディレクトリの内容を維持したまま、新しいファイルが追加される。