Dockerfile 可以将自己推送到注册表吗?

Can a Dockerfile push itself to a registry?

对于需要为其所在的每个平台构建 Dockerfile 的用例(我知道这有点小众),是否有可能将其自身推送到注册表,即调用 docker push 来自 Dockerfile?

目前,已完成:

docker build -t my-registry/<username>/<image>:<version> .
docker login my-registry
docker push <image>

登录和推送步骤是否可以直接或巧妙地内置到正在构建的 Docker 文件中或与其他步骤组合?

注意:这将在可信赖用户的安全环境中运行(因此所有用户都可以推送到注册表)。

注意:这是对 Docker 的不规范使用,一般来说对 building/packaging 软件来说不是一个好主意,我使用 Docker 是为了在开发人员之间共享环境。

Docker 构建使用 Docker 文件中提供的配方创建图像。 Dockerfile 中的每一行都会创建具有不同校验和的文件系统的新临时映像。执行 Docker 文件最后一行后的图像是构建过程的最终图像,并标有提供的名称。

因此无法将 docker 推送命令放入 Docker 文件中,因为图像创建尚未完成。

我想知道为什么你不能在 "Dockerfile" 周围有一个包装脚本文件(比如 shell 或 bat)来执行这些步骤

docker build -t my-registry/<username>/<image>:<version> .
docker login my-registry
docker push <image>

"Dockerfile" 有什么特别之处。我知道,这不是在解决您提出的问题,我可能完全误解了您的用例,但我只是好奇。

正如其他人指出的那样,这可以使用像 Drone 这样的 CD 系统轻松实现。io/Travis/Jenkins 等

乍一看,这听起来像是流传很广的"Nasa's Space pen Myth"。但正如我之前所说,您可能有一个我还不知道的正确有效用例。

拥有 Dockefile 推送它自己的图像是行不通的。

再解释一下:

构建和映像时会发生什么:Docker 将生成一个容器并执行 Dockerfile 指定的所有操作。您甚至可以在构建期间 运行ning docker ps 时看到这一点。如果容器的退出状态为 0(无错误),则从容器创建一个图像。

除了构建参数之外,我们对这个过程没有太多控制。这绝对是先有鸡还是先有蛋的问题。

构建系统应该到这个东西

在 Jenkins 中做到这一点甚至相当容易。我使用的 Jenkins 设置使用 docker 插件并向远程 docker 主机执行构建命令。因此 Jenkins 节点仅拉取 repo,运行s 构建,然后将图像推送到正确标记的私人仓库(然后删除本地图像)。您还可以通过创建一个单独的 Docker 文件在 docker 中 运行 进行单元测试(当您需要外部模拟服务时会变得有点复杂)

每个 branch/architecture 的构建并不难设置。通过远程主机执行构建工作,我们可以将 Jenkins 中的作业限制提高到相当高的水平,并且它可以 运行 在便宜的硬件上。

您还可以 运行 Jenkins in docker 并使其在 docker 引擎中构建图像 运行s。我只是通过 TLS 或将套接字文件映射到 Jenkins 容器的老技巧可能仍然有效。

我想我是从 CloudBees Docker Build and Publish plugin 开始的,它相当容易使用,但现在我使用自定义插件,所以我不知道其他选择。