如何推动什么更改与Docker推?

A。 这是我如何创build图像:

  1. 得到最新的Ubuntu镜像
  2. 作为容器,并附加到它
  3. 从Docker容器中的git克隆源代码
  4. 标记并推入docker图像到我的registry

B。 从另外一台机器上拉下来,改变并推动它:

  1. Docker从registry中拉出来
  2. 用拉出的图像启动容器并附加到它
  3. 改变克隆的git目录中的东西
  4. 停止容器,标记并将其推送到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" 

即使行为的最终结果是相同的,这两张图片也相隔数英里。 所以要注意这样的事情。