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

Single dockerfiles GitHub repository + Docker Hub automated builds

我想在 GitHub 上创建一个 dockerfiles 存储库,以集中我目前创建的所有自定义 Dockerfile。我还想在 Docker Hub 上独立地自动化构建每个图像。

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

(我不会在这里谈论星标最多的存储库:https://github.com/jessfraz/dockerfiles, because as you can see 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 Settings(实际上,只有 Dockerfile Location 不同):

缺点

使用此配置,如果对 master 分支进行推送,所有图像 将被重建(即使只有 1 个 Dockerfile推送和Docker文件位置不同)。我查了下,vimagick's repository好像是这样配置的。但我认为这不是正确的方法(如果我错了,请告诉我)。

当然,在每个自动构建的构建设置中,我可以禁用选项“激活时,构建将在推送时自动发生 " 来避免这种情况,但我必须根据 Dockerfile 我更新的内容(不是自动的)手动触发每个构建。

提高自动化程度?

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

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

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

如果我选择解决方案 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

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

也许使用单个存储库是可能的,这只是找到正确的 Docker Hub 构建设置。

最佳做法是什么?

首先,没有最佳做法,只有适合您的做法。如我所见,关于公共存储库 dockerfiles 的决定 1.) 和 2.) 都非常适合应用 Docker 集线器自动化,但我建议补充它们,正如您提到的 git submodulesgit subtrees。我不会详细介绍 Docker Hub 自动化,但会介绍如何保留公共存储库 dockerfiles:

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

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

不幸的是,你不能 AFAIK select 只有一个文件使用子模块,而是你有 link 到原始仓库。你可以看看 Linking a single file from another git repository and also git: symlink/reference to a file in an external repository. But be careful with submodules because there are well-known drawbacks, if someone besides you wants to use it. I also put an example 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 原则,所以选择最适合您需求的选项。