gpt4 book ai didi

git - 单个 dockerfiles GitHub 存储库 + Docker Hub 自动构建

转载 作者:行者123 更新时间:2023-12-03 00:12:53 27 4
gpt4 key购买 nike

我想创建一个dockerfiles GitHub 上的存储库可集中所有自定义 Dockerfile到目前为止我已经创建了。我还想独立地自动化 Docker Hub 上每个镜像的构建。

GitHub 上有很多这样的存储库:

(我不会在这里谈论最受关注的存储库:https://github.com/jessfraz/dockerfiles,因为正如您所看到的on Docker Hub,这些是不是自动构建)

想要 dockerfiles 的结构存储库

我想要我的dockerfiles GitHub 存储库具有以下结构(分支 master ),基于我上面提到的 GitHub 存储库:

dockerfiles (GitHub repo)
|- docker-image-1
|- Dockerfile
|- docker-image-2
|- Dockerfile
|- ...

Docker Hub 构建自动化

配置

在 Docker Hub 上,我可以创建 2 个公共(public)自动化构建:docker-image-1docker-image-2 ,都指的是我的dockerfiles GitHub 存储库,但具有不同的build设置(事实上,只有Dockerfile 位置不同):

  • 对于 docker-image-1 :
    • 类型:分支
    • 姓名:master
    • Dockerfile 位置:/docker-image-1/
    • Docker 标签名称:最新
  • 对于 docker-image-2 :
    • 类型:分支
    • 姓名:master
    • Dockerfile 位置:/docker-image-2/
    • Docker 标签名称:最新

缺点

使用此配置,如果按下master所有图像将被重建。分支已创建(即使只有 1 Dockerfile 与推送有关,并且 Dockerfile 位置不同)。我查了一下,vimagick's repository好像是这样配置的。但我认为这不是正确的方法(如果我错了,请告诉我)。

当然,在每个自动构建的build设置中,我可以禁用选项“当事件时,构建将在推送时自动发生”以避免这种情况,但我'必须根据什么手动触发每个构建Dockerfile我已更新(非自动)。

提高自动化程度?

我认为提高自动化的解决方案是:

  1. 将每个Dockerfile分开在其自己的 GitHub 存储库中。没有了 dockerfiles存储库,因此每个都有自己的工作流程
  2. 使用单个 GitHub 存储库 dockerfiles ,但具有不同的分支(每个 Docker 镜像一个)。然后可以将每个构建配置为仅在适当的分支上触发

通过这些解决方案,问题是我失去了所有 Dockerfile全局概览 s。我更喜欢使用单个分支的单个存储库的想法,但我不希望在这个单个分支上的每次推送时重建所有图像。

如果我选择解决方案 1,我不知道是否 git可以帮助我保留单个存储库 dockerfiles引用我所有的存储库,例如:

 dockerfiles (GitHub repo)
|- docker-image-1 -> link to https://github.com/norbjd/docker-image-1
|- Dockerfile
|- docker-image-2 -> link to https://github.com/norbjd/docker-image-2
|- Dockerfile

这样克隆整个项目并执行 pull 请求会更容易(因为某些图像是相关的:更新 docker-image-1/Dockerfile 可能会导致更新 docker-image-2/Dockerfile )。我读过有关 Git 子模块和子树的内容,但我不知道它们在这里是否合适。

也许单个存储库就可以实现,只需找到正确的 Docker Hub build设置即可。

最佳实践是什么?

最佳答案

首先,没有最佳实践,只有适合您的方法。正如我所见,关于公共(public)存储库的决定 1.) 和 2.) dockerfiles为了应用 Docker Hub 自动化,它们非常好,但我建议对它们进行补充,正如您在 git submodules 中提到的那样或git subtrees 。我不会详细介绍 Docker Hub 自动化,而是介绍如何保留公共(public)存储库 dockerfiles :

1.) 您可以分隔 Dockerfile自己的 GitHub 存储库中的图像。然后在你的 dockerfiles我建议使用git submodule :

git submodule add https://github.com/norbjd/docker-image-1
git commit -m "Add docker-image-1 as submodule"

不幸的是,据我所知,您无法使用子模块仅选择一个文件,而是拥有指向原始存储库的链接。您可以看看Linking a single file from another git repository还有git: symlink/reference to a file in an external repository 。但要小心子模块,因为有 well-known drawbacks ,如果您以外的人想要使用它。我还举了一个例子here向您展示它的样子。

2.) 您可以仅使用一个 GitHub dockerfiles 存储库,但我会使用 git subtree 。您可以使用不同分支中的子树来拆分您的存储库,从而使用一个非常干净的树来组织多个模块。

git subtree split --prefix=docker-image-1 -b docker-image-1-subtree

检查this post有关子树的更多信息。我没有时间玩git subtree给你举个例子,但我想你能明白我的意思。

因此,作为纯粹主义者,我不建议使用 git submodule我读到很多人说git subtree太棒了,所以我会选择选项 2。)。但我根本不是纯粹主义者,分离存储库可以简化 Docker Hub 自动化,而且这是 CI 原则,因此请选择最适合您需求的选项。

关于git - 单个 dockerfiles GitHub 存储库 + Docker Hub 自动构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53209370/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com