当前位置: 首页 > 知识库问答 >
问题:

单个泊坞站文件 GitHub 存储库 Docker Hub 自动构建

冉锋
2023-03-14

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

GitHub上有许多类似的存储库:

  • https://github.com/tianon/dockerfiles
  • https://github.com/vimagick/dockerfiles

(我不会在这里谈论最星号的存储库:https://github.com/jessfraz/dockerfiles,因为正如您在Docker Hub上看到的,这些不是自动构建)

我希望我的泊坞文件GitHub存储库具有以下结构(分支主节点),基于我上面提到的GitHub存储库:

dockerfiles (GitHub repo)
    |- docker-image-1
        |- Dockerfile
    |- docker-image-2
        |- Dockerfile
    |- ...

在 Docker Hub 上,我可以创建 2 个公共自动构建版本:docker-image-1docker-image-2,两者都引用我的 dockerfile GitHub 存储库,但具有不同的构建设置(实际上,只有 Dockerfile 位置不同):

  • 对于泊坞窗映像-1
    • 类型 : 分行
    • 姓名 : 主
    • 泊坞文件位置 : /docker-image-1/
    • 泊坞站标记名称 : 最新
    • 类型:分支
    • 名称:master
    • Dockerfile位置:/docker-image-2/
    • Docker标签名称:最新

    使用这种配置,如果在< code>master分支上进行推送,将会重建所有映像(即使只有一个< code>Dockerfile与推送和Dockerfile位置不同有关)。我查过了,vimagick的资源库好像是这样配置的。但我觉得这不是正确的方法(如果我错了,告诉我)。

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

    我认为可以改进自动化的解决方案有:

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

    使用这些解决方案,问题是我丢失了所有< code>Dockerfile的全局概览。我更喜欢具有单个分支的单个存储库的想法,但我不希望在这个单个分支上的每次推送中重建所有映像。

    如果我选择解决方案1,我不知道git是否可以帮助我保持单个存储库dockerfilesreference我的所有存储库,例如:

     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
    

    然后,克隆整个项目并执行拉取请求会更容易(因为某些图像是相关的:更新泊坞窗映像-1/Dockerfile可能会导致更新泊坞窗映像-2/Dockerfile)。我已经阅读了有关Git子模块和子树的信息,但我不知道这些在这里是否合适。

    也许可以使用单个存储库,只需找到正确的Docker Hub构建设置。

    最佳实践是什么?

共有1个答案

水焱
2023-03-14

首先,除了对你有用的东西,没有最佳实践。如我所见,关于公共存储库dockerfiles的决定1.)和2.)对于应用Docker Hub自动化来说都是很好的,但我建议用git子模块dockerfiles

1.)您可以在自己的GitHub存储库中分离Dockerfile图像。然后,在您的dockerfiles中,我建议使用git子模块:

git submodule add https://github.com/norbjd/docker-image-1
git commit -m "Add docker-image-1 as submodule"

遗憾的是,您不能使用子模块AFAIK只选择一个文件,而是有指向源repo的链接。您可以查看将单个文件从另一个git存储库链接,以及将git:symlink/reference链接到外部存储库中的文件。但是要小心子模块,因为如果除您之外的其他人想使用它,那么它有众所周知的缺点。我还举了一个例子,向你展示它的样子。

2.)您只能使用一个GitHub dockerfiles存储库,但是我会使用< code>git subtree。您可以使用不同分支中的子树来拆分您的回购协议,让几个模块以一个非常干净的树来组织。

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

查看此帖子以了解关于子树的更多信息。我没有时间玩< code>git subtree来给你一个例子,但是我想你会明白的。

因此,作为纯粹主义者,我不建议使用git子模块,我读过很多人说git子树is awose,所以我会选择选项2。)。但我根本不是一个纯粹主义者,分离回购将简化Docker Hub自动化,也是一个CI原则,所以选择最适合您需求的选项。

 类似资料:
  • 我正在使用自动构建为基准测试套件创建docker映像。在其中一个基准测试中,即网络搜索,我必须使用一个非常大的索引文件(11GB)。我的映像没有被构建,我收到了这个错误: 但是当我检查很长的构建日志时,在最后一行中,我可以看到它实际上已经成功构建: 似乎负责创建该映像的工作进程失去了与其主节点(注册表节点)的连接,而它仍在处理和构建映像。这可能是因为下载索引文件需要几个小时。 我能做些什么来防止这

  • 对于Docker Hub项目,如何找到手动触发或通过触发url触发的自动化构建的状态。 < li >我想了解它是否正在运行,以及它当前的运行状态(即仍在运行还是构建已完成) < li >过去版本列表 < li >所有构建的状态(启动时间、完成时间、构建状态)

  • 我很难为个人项目设置golang dockerfile。 项目结构为: 该应用程序每5秒打印一个随机哈希,并在其上附加一个时间戳。 文件内容: 日志 go.mod: hash.go: 我拼凑了以下泊坞文件: 然而,我一直得到这个错误(和类似的错误): 我已经在网上搜索了几个小时试图解决这个问题,我真的不明白它有什么问题。当谈到docker文件中的依赖管理时,我怀疑我做错了什么。 我提到我是围棋新手

  • 在自动化的dockerhub构建过程中,是否有一种方法可以连接到多个私有git回购?我们正在构建golang应用程序,需要‘去获取’其他私人回购作为我们构建的一部分,目前他们失败了,因为docker无法连接到他们,只有目标私人回购。 主回购很好,因为部署密钥是通过Dockerhub安装的,但是任何后续的私有回购导入都失败了。

  • 我正在尝试使用Flask和Docker开发一个小型音乐应用程序。我有两个码头服务,都在经营烧瓶。 第一个称为上传器: 第二个渲染了一个Jinja模板,该模板试图播放此API返回的文件: 另外,这些组件工作正常。但当一起使用时,文件不会播放。我已经尝试了我在网上找到的几乎所有东西,但似乎都不起作用。任何帮助将不胜感激。谢谢! 编辑:添加了泊动器撰写文件。两个泊坞窗映像都是在本地构建的。

  • 问题内容: 我正在docker容器内的GCE上运行jenkins实例,并希望从此Jenkinsfile和Github执行多分支管道。我正在为此使用GCE詹金斯教程。这是我的 我总是得到一个错误: 为了使docker在jenkins中工作,我需要更改什么? 问题答案: 看起来像DiD(Docker中的Docker),最近的一期杂志指出这是有问题的。 请参阅“ 在您的CI或测试环境中使用Docker-