我想在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上,我可以创建2个公共自动构建:docker-image-1
和docker-image-2
,都引用我的dockerfiles
GitHub存储库,但具有不同的Build Settings(实际上,只有Dockerfile Location 不同):
docker-image-1
:docker-image-2
:使用此配置,如果在master
分支上进行了推送,则将重新构建所有图像(即使该推送仅涉及1个Dockerfile
,并且Dockerfile位置也不同) 。我已经检查过,似乎已为vimagick's repository进行了这样的配置。但是我认为这不是正确的方法(如果我错了,请告诉我)。
当然,在每个自动构建的Build Settings中,我可以禁用选项“ 当活动时,构建将在推送时自动发生”以避免这种情况,但我必须手动触发每个构建取决于我更新了什么Dockerfile
(不是自动的)。
我看到的改善自动化的解决方案是:
Dockerfile
分隔为其自己的GitHub存储库中。不再有dockerfiles
存储库,因此每个存储库都有其自己的工作流程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 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,向您展示它的外观。,但随后我将使用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的原则,因此请选择最适合您需求的选项。