如何推动什么更改与Docker推?
A。 这是我如何创build图像:
- 得到最新的Ubuntu镜像
- 作为容器,并附加到它
- 从Docker容器中的git克隆源代码
- 标记并推入docker图像到我的registry
B。 从另外一台机器上拉下来,改变并推动它:
- Docker从registry中拉出来
- 用拉出的图像启动容器并附加到它
- 改变克隆的git目录中的东西
- 停止容器,标记并将其推送到registry
现在我看到的问题是,每当重复B ,它会尝试上传〜600MB(这是公共图像层)的registry,这在我的情况下需要很长的时间。
有没有办法避免上传整个600MB,而是推动唯一的目录已经改变?
我究竟做错了什么? 你们如何使用docker频繁推送?
Docker只会推送更改的图层,所以看起来好像工作stream中的某些内容不太正确。 如果你使用一个Dockerfile
,会更清晰,因为每条指令都明确地创build一个图层,但即使使用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
运行一个新的容器,创build一个空文件并运行docker commit
来创build一个新的图像,新图层只有已更改的文件:
> 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的图层会被上传 – 其他的图片则从已经在Hub中的ubuntu
挂载。 如果我推动第二个图像,只有被更改的图层被推入 – 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的更改,要么你的工作stream程正在阻止Docker正确使用图层。
Docker已经只上传更改后的图层。
它类似于Docker构build只重build高速caching失效的层。 当然,它必须与registry进行通信,哪些图层可用(它报告Already pushed
)。 如果你在Dockerfile中改变了你的操作顺序,那么它们是绝对新的层次,所有的层次都会被重新上传。
FROM ubuntu RUN echo "hello" EXPOSE 80
和
FROM ubuntu EXPOSE 80 RUN echo "hello"
即使行为的最终结果是相同的,这两张图片也相隔数英里。 所以要注意这样的事情。