如何推动只有用Docker推送改变了什么?

时间:2016-10-03 10:31:22

标签: docker docker-registry

A 即可。以下是我创建图像的方法:

  1. 获得最新的Ubuntu图片
  2. 作为容器运行并附加到
  3. 从docker容器中的git克隆源代码
  4. 将docker镜像标记并推送到我的注册表
  5. 即可。我从另一台机器上拉,改变并推动它:

    1. Docker来自注册表
    2. 使用提取的图片启动容器并附加到
    3. 更改克隆的git目录中的内容
    4. 停止容器,标记并将其推送到注册表
    5. 现在我看到的问题是,每次 B 重复时,它会尝试将~600MB(这是公共图像层)上传到注册表,这在我的案例中需要很长时间

      有没有办法避免上传整个600MB,而是推送唯一已更改的目录?

      我做错了什么?你们如何使用码头工具进行频繁推动?

2 个答案:

答案 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"

即使行为最终结果相同,这两幅图像相隔数英里。所以要小心这些事情。