单个 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-1
和 docker-image-2
,都指的是我的 dockerfiles
GitHub 存储库,但具有不同的 Build Settings(实际上,只有 Dockerfile Location 不同):
- 对于
docker-image-1
:
- 类型:分支
- 姓名:大师
- Docker文件位置:/docker-image-1/
- Docker 标记名称 : 最新
- 对于
docker-image-2
:
- 类型:分支
- 姓名:大师
- Docker文件位置:/docker-image-2/
- Docker 标记名称 : 最新
缺点
使用此配置,如果对 master
分支进行推送,所有图像 将被重建(即使只有 1 个 Dockerfile
推送和Docker文件位置不同)。我查了下,vimagick's repository好像是这样配置的。但我认为这不是正确的方法(如果我错了,请告诉我)。
当然,在每个自动构建的构建设置中,我可以禁用选项“激活时,构建将在推送时自动发生 " 来避免这种情况,但我必须根据 Dockerfile
我更新的内容(不是自动的)手动触发每个构建。
提高自动化程度?
我认为提高自动化的解决方案是:
- 在其 自己的 GitHub 存储库 中将每个
Dockerfile
分开。不再有 dockerfiles
个存储库,因此每个存储库都有自己的工作流程
- 使用单个 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 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 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 原则,所以选择最适合您需求的选项。
我想在 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-1
和 docker-image-2
,都指的是我的 dockerfiles
GitHub 存储库,但具有不同的 Build Settings(实际上,只有 Dockerfile Location 不同):
- 对于
docker-image-1
:- 类型:分支
- 姓名:大师
- Docker文件位置:/docker-image-1/
- Docker 标记名称 : 最新
- 对于
docker-image-2
:- 类型:分支
- 姓名:大师
- Docker文件位置:/docker-image-2/
- Docker 标记名称 : 最新
缺点
使用此配置,如果对 master
分支进行推送,所有图像 将被重建(即使只有 1 个 Dockerfile
推送和Docker文件位置不同)。我查了下,vimagick's repository好像是这样配置的。但我认为这不是正确的方法(如果我错了,请告诉我)。
当然,在每个自动构建的构建设置中,我可以禁用选项“激活时,构建将在推送时自动发生 " 来避免这种情况,但我必须根据 Dockerfile
我更新的内容(不是自动的)手动触发每个构建。
提高自动化程度?
我认为提高自动化的解决方案是:
- 在其 自己的 GitHub 存储库 中将每个
Dockerfile
分开。不再有dockerfiles
个存储库,因此每个存储库都有自己的工作流程 - 使用单个 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 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 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 原则,所以选择最适合您需求的选项。