如何仅推送 Docker 推送更改的内容?

How to push only whats changed with Docker push?

A。这是我创建图像的方式:

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

B。从另一台机器上,我通过以下方式拉动、更改和推动它:

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

现在我看到的问题是,每次重复 B 时,它都会尝试将 ~600MB(即 public 图像层)上传到注册表这对我来说需要很长时间。

有什么方法可以避免上传整个 600MB 而是推送唯一已更改的目录吗?

我做错了什么?你们是怎么用docker频繁推送的?

Docker 已经只上传了更改的图层。

这类似于Docker build 仅重建缓存失效层的方式。当然,它必须与注册表通信哪些层可用(它报告为 Already pushed)。如果您在Docker文件中更改了操作顺序,它们绝对是新层,并且所有这些都将重新上传。

FROM ubuntu

RUN echo "hello"

EXPOSE 80

FROM ubuntu

EXPOSE 80

RUN echo "hello"

尽管行为最终结果相同,但这两张图片相距甚远。所以要注意这些事情。

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 安装的,它已经在集线器中。如果我推送第二张图片,只会推送更改的层 - 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 正确使用图层。