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 开始的,它相当容易使用,但现在我使用自定义插件,所以我不知道其他选择。
对于需要为其所在的每个平台构建 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 开始的,它相当容易使用,但现在我使用自定义插件,所以我不知道其他选择。