如何仅推送 Docker 推送更改的内容?
How to push only whats changed with Docker push?
A。这是我创建图像的方式:
- 已获取最新的 Ubuntu 图片
- 运行 作为容器并附加到它
- 从 docker 容器 git 中克隆的源代码
- 标记 docker 图像并将其推送到我的注册表
B。从另一台机器上,我通过以下方式拉动、更改和推动它:
- Docker 从注册表中拉取
- 使用拉取的图像启动容器并附加到它
- 更改克隆的 git 目录中的内容
- 停止容器,标记并将其推送到注册表
现在我看到的问题是,每次重复 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 正确使用图层。
A。这是我创建图像的方式:
- 已获取最新的 Ubuntu 图片
- 运行 作为容器并附加到它
- 从 docker 容器 git 中克隆的源代码
- 标记 docker 图像并将其推送到我的注册表
B。从另一台机器上,我通过以下方式拉动、更改和推动它:
- Docker 从注册表中拉取
- 使用拉取的图像启动容器并附加到它
- 更改克隆的 git 目录中的内容
- 停止容器,标记并将其推送到注册表
现在我看到的问题是,每次重复 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 正确使用图层。