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

问题描述 投票:6回答:1

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

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

((这里我不会谈论最繁星的资源库:https://github.com/jessfraz/dockerfiles,因为您可以看到on Docker Hub,这些是not自动构建)

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 Location 不同):

  • 对于docker-image-1
    • [Type:分支
    • [名称:主]
    • Dockerfile位置/ docker-image-1 /
    • Docker标记名称:最新
  • 对于docker-image-2
    • [Type:分支
    • [名称:主]
    • Dockerfile位置/ docker-image-2 /
    • Docker标记名称:最新

缺点

使用此配置,如果在master分支上进行了推送,则将重新构建所有图像(即使该推送仅涉及1个Dockerfile,并且Dockerfile位置也不同) 。我已经检查过,似乎已为vimagick's repository进行了这样的配置。但是我认为这不是正确的方法(如果我错了,请告诉我)。

当然,在每个自动构建的Build Settings中,我可以禁用选项“ 当活动时,构建将在推送时自动发生”以避免这种情况,但我必须手动触发每个构建取决于我更新了什么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构建设置。

最佳做法是什么?

git docker dockerhub
1个回答
0
投票

首先,没有最佳实践,但最适合您的方法。如我所见,关于通用存储库dockerfiles的决策1.)和2.)都相当不错,可以应用Docker Hub自动化,但是我建议您像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仅选择一个文件,而是具有到原始存储库的链接。您可以查看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的原则,因此请选择最适合您需求的选项。

© www.soinside.com 2019 - 2024. All rights reserved.