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

nor*_*bjd 6 git docker dockerhub

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

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

(我不会在这里谈论最繁星的存储库:https : //github.com/jessfraz/dockerfiles,因为正如您在Docker Hub上看到的那样,这些不是自动构建)

想要的dockerfiles存储库结构

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

dockerfiles (GitHub repo)
    |- docker-image-1
        |- Dockerfile
    |- docker-image-2
        |- Dockerfile
    |- ...
Run Code Online (Sandbox Code Playgroud)

Docker Hub构建自动化

组态

在Docker Hub上,我可以创建2个公共自动化构建版本:docker-image-1docker-image-2,都引用我的dockerfilesGitHub存储库,但是构建设置不同(实际上,只有Dockerfile位置不同):

  • docker-image-1
    • 类型:分支
    • 姓名:主人
    • Dockerfile位置/ docker -image-1 /
    • Docker标记名称:最新
  • docker-image-2
    • 类型:分支
    • 姓名:主人
    • Dockerfile位置/ docker -image-2 /
    • Docker标记名称:最新

缺点

使用此配置,如果进行了push on 分支,则将重建所有映像master(即使Dockerfilepush 仅涉及1个,而Dockerfile Location也不同)。我检查了一下,似乎对vimagick的存储库进行了这样的配置。但是我认为这不是正确的方法(如果我错了,请告诉我)。

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

提高自动化程度?

我看到的改善自动化的解决方案是:

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

使用这些解决方案,问题在于我失去了所有S 的全局概览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
Run Code Online (Sandbox Code Playgroud)

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

也许只有一个存储库是可能的,而这仅仅是找到正确的Docker Hub构建设置。

最佳做法是什么?

Car*_*ero 4

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

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

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

Run Code Online (Sandbox Code Playgroud)

不幸的是,您不能使用子模块仅选择一个文件,而是可以链接到原始存储库。您可以查看从另一个 git 存储库链接单个文件以及git: symlink/reference to a file in an external repository。但要小心子模块,因为如果除了您之外的其他人想要使用它,子模块也有众所周知的缺点。我还在这里举了一个例子来向您展示它的样子。

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

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

Run Code Online (Sandbox Code Playgroud)

查看这篇文章以获取有关子树的更多信息。我没有时间给git subtree你举个例子,但我想你能明白我的意思。

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