【问题标题】:dockerhub automated build from single repo with single dockerfile building multiple imagesdockerhub 从单个 repo 自动构建,单个 dockerfile 构建多个图像
【发布时间】:2018-08-21 10:50:35
【问题描述】:

我在 github 上有一个 git 存储库:

  • 一个 Dockerfile,它构建了多个要一起使用的图像。 (maven 构建通过从工件存储库下载然后生成一个 war 文件和 sql 文件;然后,一个多阶段构建创建一个带有 war 的苗条 tomcat 映像和一个预先加载了 sql 数据的苗条 mysql 映像。

    李>
  • 一个 docker-compose.yml 文件,它使用“target”指令在来自多阶段构建的映像上构建和运行容器。

这在开发过程中运行良好。但它迫使用户在他们的计算机上构建图像。我希望用户只能下载图像。该设置还应该使用 dockerhub 的自动构建来保持图像最新。

如何设置它来实现这一点?我给用户什么命令或文件以允许他们下载图像和运行容器?如果不可能,我该怎么做才能使它成为可能(拆分 repo?复制粘贴 dockerfile?将中间图像发布到 dockerhub 并确保正确的构建顺序?不要使用 dockerhub 的自动构建?)

【问题讨论】:

  • 如果它是公开的(如果你正在查看 dockerhub,我猜它是公开的)如果你可以链接到 Dockerfile 会很酷
  • 感谢您的评论。 Dockerfile 和 docker-compose.yml 位于 github.com/lutece-platform/lutece-demo-site-appointment/tree/…
  • 感谢分享。快速浏览一下,我想您可以将 Dockerfile 拆分为一个用于 Web 应用程序的文件和一个用于 db 的文件(如果您愿意的话)。

标签: docker docker-compose dockerhub


【解决方案1】:

要使用dockerhub's automated builds,您需要为每个 Dockerfile 构建一个映像并拥有一个Dockerfile per repo。镜像名称来自源存储库名称(github org/user 名称作为 docker 镜像用户名,github repo 名称作为 docker 镜像名称)。多阶段构建在自动构建中工作,但每个 Dockerfile(构建的最终镜像)只发布一个镜像。

您可以在 CI 甚至本地机器上构建镜像,然后推送到 dockerhub。您只需要在 dockerhub 上拥有一个帐户,并在使用 docker push command 时登录到该帐户。执行此推送时,不必映射到 GitHub 存储库,但您的图像名称应以 <dockerhub_user>/ 开头作为一种前缀(解释为 https://docs.docker.com/docker-hub/repos/)。如果它们以不同的名称构建是可以的,因为您可以在推送之前通过重新标记来重命名。这样你也可以随心所欲地构建图像。

当您在 dockerhub 中有图像时,您可以使用 image: <dockerhub_user>/<dockerhub_image_name>:<tag> 的形式在 docker-compose 文件中引用它们。图片会在用户docker-compose up时自动拉取。

【讨论】:

    【解决方案2】:

    以下是一些可以帮助您解决问题的提示和链接:

    Automated builds 是部署映像的便捷方式。

    这部分很简单。您需要拥有 Docker Hub 和 Github 的帐户。您可以免费注册这些帐户。

    当您在 Docker Hub 上创建存储库时,您可以将其链接到您的 Github 存储库以自动构建。

    建议:

    • Split your services 到单独的 Dockerfile 中。理想情况下,您应该使用单独的存储库:Docker Compose 最终会将它们拉到一起。如果有人想实施,服务部门也会有所帮助,例如用于部署的云数据库后端。
    • 不要将数据库文件存储在容器中。 Containers should be ephemeral
    • 对于稳健的设计,test your builds

    Docker Hub 自动构建使用build hooks 非常灵活。

    这部分有点棘手,因为我还没有找到最好的文档。如果您拆分 Dockerfile,也可能没有必要。

    我已经使用hooks/build 的钩子成功地创建了具有多个标签和目标的自动化构建,但是在阅读了文档之后,您似乎也应该能够使用hooks/post_build

    你的钩子可以简单地构建正确的层并将标签推送到 Docker Hub

    对于您的存储库,应如下所示:

    #!/usr/bin/env bash
    
    docker build --target lutece-mysql -t lutece/mysql .
    docker push lutece/mysql
    

    如果您最终使用hooks/build,您可能需要在最后一步构建最终目标。

    建议:

    • 如果您需要为图像添加多个标签,请使用hooks/post_push 处的挂钩来添加其他标签。这样每个标签应该将用户链接到同一张图片。例如

      #!/usr/bin/env bash
      
      docker tag lutece/tomcat:master lutece/tomcat:latest
      docker push lutece/tomcat:latest
      
    • 此外,您还可以使用构建挂钩将图像标记为 build date and git commit 之类的内容。

    Deployment with Docker Compose

    很遗憾,我还没有完成这部分,所以我无法确认如何让它发挥作用。

    使用 Docker Hub 中的存储库和工作的 docker-compose.yml,您的客户端可能只需要在包含 docker-compose.yml 文件的目录中运行 docker-compose up。 Docker Compose 应该从 Docker Hub 中提取图像。

    【讨论】:

      猜你喜欢
      • 2016-08-19
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 2023-03-07
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多