A 即可。以下是我创建图像的方法:
乙即可。我从另一台机器上拉,改变并推动它:
现在我看到的问题是,每次 B 重复时,它会尝试将~600MB(这是公共图像层)上传到注册表,这在我的案例中需要很长时间
有没有办法避免上传整个600MB,而是推送唯一已更改的目录?
我做错了什么?你们如何使用码头工具进行频繁推动?
答案 0 :(得分:5)
Docker只会推送更改的图层,因此您的工作流程中的某些内容看起来不太合适。如果您使用Dockerfile
会更清楚,因为每条指令都明确创建了一个图层,但即使使用docker commit
,结果也应该相同。
示例 - 从ubuntu
图像运行容器并运行apt-get update
,然后将容器提交到新图像。现在运行docker history
,您将看到新图像在bash图像上添加了一个图层,该图层具有运行APT更新的附加状态:
> docker history sixeyed/temp1
IMAGE CREATED CREATED BY SIZE COMMENT
2d98a4114b7c About a minute ago /bin/bash 22.2 MB
14b59d36bae0 7 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
<missing> 7 months ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/ 1.895 kB
<missing> 7 months ago /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic 194.5 kB
<missing> 7 months ago /bin/sh -c #(nop) ADD file:620b1d9842ebe18eaa 187.8 MB
在这种情况下,ubuntu
和我的temp1
图片之间的差异是22MB图层2d98
。
现在如果我从temp1
运行一个新容器,创建一个空文件并运行docker commit
来创建一个新图像,新图层只有更改的文件:
> docker history sixeyed/temp2
IMAGE CREATED CREATED BY SIZE COMMENT
e9ea4b4963e4 45 seconds ago /bin/bash 0 B
2d98a4114b7c About a minute ago /bin/bash 22.2 MB
14b59d36bae0 7 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
<missing> 7 months ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/ 1.895 kB
<missing> 7 months ago /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic 194.5 kB
<missing> 7 months ago /bin/sh -c #(nop) ADD file:620b1d9842ebe18eaa 187.8 MB
当我push
第一张图片时,只会上传22MB图层 - 其他图片将从ubuntu
安装,该版本已在Hub中。如果我按下第二张图像,只会推送更改的图层 - 从第一次推送开始安装temp1
图层:
> docker push sixeyed/temp2
The push refers to a repository [docker.io/sixeyed/temp2]
f741d3d3ee9e: Pushed
64f89772a568: Mounted from sixeyed/temp1
5f70bf18a086: Mounted from library/ubuntu
6f32b23ac95d: Mounted from library/ubuntu
14d918629d81: Mounted from library/ubuntu
fd0e26195ab2: Mounted from library/ubuntu
因此,如果您的推送正在上传600MB,那么您要么对图像进行600MB更改,要么您的工作流程阻止Docker正确使用图层。
答案 1 :(得分:0)
Docker已经只上传了更改过的图层。
类似于Docker构建仅重建缓存无效层的方式。当然,它必须与注册表进行通信,哪些层可用(报告为Already pushed
)。如果你在Dockerfile中更改了操作的顺序,那么它们绝对是新的层,所有这些层都将被重新上传。
FROM ubuntu
RUN echo "hello"
EXPOSE 80
和
FROM ubuntu
EXPOSE 80
RUN echo "hello"
即使行为最终结果相同,这两幅图像相隔数英里。所以要小心这些事情。