【问题标题】:Single dockerfiles GitHub repository + Docker Hub automated builds单个 dockerfiles GitHub 存储库 + Docker Hub 自动构建
【发布时间】:2019-04-12 01:23:15
【问题描述】:

我想在 GitHub 上创建一个 dockerfiles 存储库,以集中我迄今为止创建的所有自定义 Dockerfiles。我还想独立地在 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 存储库,但使用不同的构建设置(实际上,只有Dockerfile Location 不同):

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

缺点

使用此配置,如果在 master 分支上进行推送,所有图像 将被重建(即使推送和 Dockerfile 位置只涉及 1 个 Dockerfile /em>s 不同)。我检查过,它似乎是为vimagick's repository 配置的。但我不认为这是正确的方式(如果我错了,请告诉我)。

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

提高自动化程度?

我看到的提高自动化程度的解决方案是:

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

使用这些解决方案,问题是我丢失了我所有Dockerfiles 的全局概览。我更喜欢带有单个分支的单个存储库的想法,但我不希望在这个单个分支上的每次推送时都重新构建所有图像。

如果我选择解决方案 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】:

    首先,没有最佳做法,只有适合你的东西。正如我所看到的,关于公共存储库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 repositorygit: 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。)。但我根本不是一个纯粹主义者,分离 repos 会简化 Docker Hub 自动化,而且它也是 CI 原则,所以选择最适合您需求的选项。

    【讨论】:

    • 感谢您的回答。如果我理解正确subtree,则具有 1 个分支 = 1 个Dockerfile 的第二个解决方案将删除一目了然地查看所有Dockerfiles 的能力:查看/编辑特定的 Dockerfile,checkouting 适当的分支将需要。对吗?
    • 是的,乍一看是正确的(它被组织成一棵树,所以它就在那里)并且 AFAIK Docker Hub 集成不如选项 1 自动化
    • 好主意 w.r.t.使用子模块来管理单个 Dockerhub 存储库。感谢您的回答!
    • 我想我将使用第一个解决方案(子模块),或者稍微修改第二个解决方案以使用单个存储库而不是带有子树的不同分支。感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 2019-12-24
    • 1970-01-01
    • 2018-01-05
    • 2021-03-07
    • 1970-01-01
    • 2015-01-01
    相关资源
    最近更新 更多