如何推动仅使用Docker推送改变了什么?

Gri*_*fin 2 docker docker-registry

.这是我创建图像的方式:

  1. 得到了最新的Ubuntu图像
  2. 作为容器运行并附加到它
  3. 从docker容器中的git克隆源代码
  4. 标记并将docker镜像推送到我的注册表

.从另一台机器我拉,改变并推动它:

  1. Docker从注册表中拉出来
  2. 使用拉出的图像启动容器并附加到其上
  3. 更改克隆的git目录中的内容
  4. 停止容器,标记并将其推送到注册表

现在我看到的问题是,每次重复B时,它都会尝试将~600MB(这是公共图像层)上传到注册表,这在我的情况下需要很长时间.

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

我究竟做错了什么?你们如何使用docker进行频繁推送?

Elt*_*man 5

Docker只会推送更改的图层,因此看起来您工作流程中的某些内容不太合适.如果你使用a会更清楚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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,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
Run Code Online (Sandbox Code Playgroud)

当我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                          
Run Code Online (Sandbox Code Playgroud)

因此,如果您的推送正在上传600MB,那么您要么对图像进行600MB更改,要么您的工作流程阻止Docker正确使用图层.