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

时间:2018-11-08 14:05:05

标签: git docker dockerhub

我想在GitHub上创建一个dockerfiles存储库,以集中我到目前为止创建的所有自定义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个公共自动化版本:docker-image-1docker-image-2,它们均引用我的dockerfiles GitHub存储库,但是具有不同的 Build Settings (实际上,只有 Dockerfile位置不同):

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

缺点

使用此配置,如果在master分支上进行了推送(即使只有1个Dockerfile与推送和所有图像 > Dockerfile位置不同)。我已经检查过了,似乎vimagick's repository的配置是这样的。但是我认为这不是正确的方法(如果我错了,请告诉我)。

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

提高自动化程度?

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

  1. 将每个Dockerfile分别放在其自己的GitHub存储库中。没有更多的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构建设置。

最佳做法是什么?

1 个答案:

答案 0 :(得分:2)

首先,没有最佳实践,但最适合您的方法。如我所见,关于通用存储库dockerfiles的决策1.)和2.)都很好,可以应用Docker Hub自动化,但是我建议您像git submodules那样对它们进行补充或git 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仅选择一个文件,而是具有到原始存储库的链接。您可以查看Linking a single file from another git repository,也可以查看git: symlink/reference to a file in an external repository。但是要小心子模块,因为如果您想使用well-known drawbacks,则还有here。我还举了一个示例this post,向您展示了它的外观。

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

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

检查How to fix ASP.NET error "The file 'nnn.aspx' has not been pre-compiled, and cannot be requested."?以获得有关子树的更多信息。我没有时间陪git subtree来举一个例子,但是我想您可以理解。

因此,作为一名纯粹主义者,我不建议使用git submodule,而且我读到很多人说git subtree非常棒,因此我会选择选项2。)。但是我根本不是一个纯粹主义者,将存储库分离会简化Docker Hub的自动化,这也是CI的原则,因此请选择最能满足您需求的选项。