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