【问题标题】:Docker swarm: 'build' configuration in docker compose file ignored during stack deploymentDocker swarm:在堆栈部署期间忽略 docker compose 文件中的“构建”配置
【发布时间】:2018-07-01 23:05:49
【问题描述】:

我们创建了一个包含多个服务的 docker compose 文件。这些服务的图像是使用“构建”配置选项在运行时构建的。相应的 Dockerfile(s) 在各自的目录中给出。

示例 docker compose 文件...

version: '3'
services:
  db2server:
    build: ./db2server
    ports:
      - "50005:50000"
    command: ["db2start"]
  appruntime:
    build: ./appruntime
    depends_on:
     - db2server

此 docker compose 文件适用于 docker-compose 命令。

  • 映像是在运行时从db2serverappruntime 目录中存在的Dockerfile 构建的
  • 这些映像部署在主机中

但是当我们尝试在 docker swarm 中部署它时,会抛出以下错误...

docker stack deploy -c /home/docker/docker-compose.yml app

Ignoring unsupported options: build

Creating network app_default
Creating service app_db2server
failed to create service app_db2server: Error response from daemon: rpc error: code = InvalidArgument desc = ContainerSpec: image reference must be provided

在 docker swarm 中的堆栈部署期间似乎忽略了“构建”配置选项。

我们如何在 docker swarm 的 docker compose 文件中部署这些服务(带有构建选项)。

【问题讨论】:

    标签: docker docker-compose dockerfile docker-swarm


    【解决方案1】:

    简短的回答是,您不能将build 命令与docker stack deploy 一起使用。

    来自docs

    注意docker stack 命令build 选项在使用(版本 3)撰写文件以群模式部署堆栈时被忽略。 docker stack 命令仅接受预构建的图像。

    另一种方法是在部署 swarm 集群之前构建 docker 映像。

    使用docker build命令创建docker镜像;将创建的镜像推送到(公共或私有)docker registry;并在您的 docker compose 文件中引用它。

    【讨论】:

    • 我发现构建、推送图像对于小的开发修改来说很耗时,有没有更省时的替代方案?
    • 您可以使用labels 设置开发节点,您可以将堆栈限制为仅在该节点中运行,这样您就不必在同一节点上构建镜像节点。
    【解决方案2】:

    撰写文件同时提供两种工具:docker-compose cli 和 docker stack cli。 "build" 选项在docker-compose 中工作,但被堆栈命令忽略,而"deploy" 选项在堆栈命令中工作,但被docker-compose 忽略。

    Swarm 并非旨在为您构建图像。它假定您的图像在图像注册表中可用。 Swarm 中的多个节点不能相互共享图像,因此注册表(远程或在 Swarm 本身上运行)是它们都可以确保它们可以提取相同的确切图像的唯一方法。

    因此,典型示例是让 Docker Hub 根据代码提交自动构建您的镜像,或者让您的 CI/CD 平台构建镜像并推送到注册表。然后您的stack deploy 命令将从该注册表中提取正确的图像。

    【讨论】:

      【解决方案3】:

      如果有人仍在使用此功能,您可以通过将图像参数与构建参数一起设置来在 compose 中标记构建的图像,正如您在 docs 的构建部分中看到的那样。所以文件应该是这样的:

      version: '3'
      services:
        db2server:
          image: <your registry here>/db2server
          build: ./db2server
          ports:
            - "50005:50000"
          command: ["db2start"]
        appruntime:
          image: <your registry here>/appruntime
          build: ./appruntime
          depends_on:
           - db2server
      

      那么你可以这样做:

      docker-compose build
      docker-compose push
      docker stack deploy -c /home/docker/docker-compose.yml app
      

      【讨论】:

      • 如果 docker stack 支持像 --build 这样的标志会很好,这仅在使用时可用,例如--orchestrator none--orchestrator singlenode
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 2019-10-14
      相关资源
      最近更新 更多