很长一段时间以来,我使用 Docker 和一个中间容器构建了一个应用程序,例如,我将构建myapp:base
一个复制了所有核心文件的应用程序:
FROM ubuntu:17.10
ADD app /app
myapp:release
现在,可以简单地用这个创建主容器
FROM myapp:base
ADD app /app
目录中可能会修改一些文件app
,最后我会添加一个小的额外层。
不过最近,这个决赛ADD
导致了一个更大的层,我怀疑它与 Docker 更新有关(我使用的是 Docker 版本 18.02.0-ce,构建 fc4de44)
Docker 找出不同之处的方式是否发生了变化?我怎样才能回到一个层中只有少量更新文件的高效构建?
重现步骤:
# make a dummy dir with a 64kb file in it
mkdir -p files
truncate -s 64k files/64k.file
# base container has a copy of the files
cat << EOF > Dockerfile.base
FROM ubuntu:16.04
COPY files/ /root/
EOF
# derived container should just have any updates
cat << EOF > Dockerfile.derived
FROM q899941:base
COPY files/ /root/
EOF
# build them....
docker build --file Dockerfile.base -t q899941:base .
docker build --file Dockerfile.derived -t q899941:derived .
# now let's review the layers
docker history q899941:derived
我得到这个结果
IMAGE CREATED CREATED BY SIZE
4e1eb5168d55 Less than a second ago /bin/sh -c #(nop) COPY dir:8e20ede288278c71e… 65.5kB
022626ac5cf0 Less than a second ago /bin/sh -c #(nop) COPY dir:8e20ede288278c71e… 65.5kB
0458a4468cbc 5 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 5 weeks ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
<missing> 5 weeks ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$… 2.76kB
<missing> 5 weeks ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B
<missing> 5 weeks ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 745B
<missing> 5 weeks ago /bin/sh -c #(nop) ADD file:a3344b835ea6fdc56… 112MB
即使没有文件更改,顶层也是 64kb。