93644


Dockerfile内で同一ファイルを同じ場所に複数回COPYしたとき、docker
buildで生成したコンテナに含まれるファイルは1つしかないのにも関わらず、コンテナのイメージサイズが1回コピーした場合よりも大きくなるのはなぜでしょうか？

下記のようなDockerfileの場合です。

[code]

    FROM python:3.9.13
    
    WORKDIR /app
    
    COPY . /app
    COPY . /app
    
[/code]

カレントディレクトリには`test.txt`はDockerfileの他に数MBのテキストファイルがあります。

[code]

    ~/test$ ls
    Dockerfile  test.txt
    
[/code]

`docker build`は下記で実施しています。

[code]

    ~/test$ docker build -t test .
    
[/code]


CC BY-SA 4.0
2023-01-31T14:38:21.473
93641
2023-01-31T20:51:55.953
19297
question
docker docker-compose
Dockerfile内で同一ファイルを同じ場所に複数回COPYしたとき、イメージサイズが大きくなるのはなぜか


COPYコマンドの度にレイヤーが生成されるから、ではないでしょうか。

[Dockerfile 記述のベストプラクティス | Docker
ドキュメント](https://matsuand.github.io/docs.docker.jp.onthefly/develop/develop-
images/dockerfile_best-practices/)

> 各コマンドからは 1 つずつレイヤーが生成されます。

[caching - Docker have the same file in multiple layers - Stack
Overflow](https://stackoverflow.com/questions/70695421/docker-have-the-same-
file-in-multiple-layers)

本家に同様のQAがありました。


CC BY-SA 4.0
2023-01-31T17:59:40.050
93642
2023-01-31T17:59:40.050
4982
93641
answer


jhashimotoさんの回答では「コンテナのイメージサイズが1回コピーした場合よりも大きくなるのはなぜでしょうか？」には答えられていないので、もう少し補足します。

[Dockerfile
記述のベストプラクティス](https://matsuand.github.io/docs.docker.jp.onthefly/develop/develop-
images/dockerfile_best-practices/)

> 各コマンドからは 1 つずつレイヤーが生成されます。  
>  （略）  
>  イメージを実行してコンテナーが生成されると、それまであったレイヤーの上に **書き込み可能なレイヤー** （「コンテナーレイヤー」）が加えられます。
> 実行されているコンテナーへの変更、つまり新規ファイル生成や既存ファイル編集、ファイル削除などはすべて、この書き込みレイヤーに書き込まれます。

つまり、下のレイヤーがどうであれ、`COPY`で行われた書き込みは全て新しいレイヤー上に表現されます。  
差分検出してくれれば…という期待はわからなくもないですが、そうなっていません。これは通常の`cp`コマンドなどでも同じで、上書き可能かどうかの判断は行われますが、コピー元・コピー先の内容比較は行わずに常に上書きされます。


CC BY-SA 4.0
2023-01-31T20:51:55.953
93644
2023-01-31T20:51:55.953
4236
93641
answer