Docker swarm:'build' 配置在 docker compose 文件中,在堆栈部署期间被忽略

Docker swarm: 'build' configuration in docker compose file ignored during stack deployment

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

示例docker 撰写文件...

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

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

但是当我们尝试在 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

看起来 'build' 配置选项在 docker 群中的堆栈部署期间被忽略了。

我们如何部署 docker compose 文件中定义的这些服务(使用构建选项)docker swarm。

简而言之,您不能将 build 命令与 docker stack deploy 一起使用。

来自docs

Note: The docker stack command build option is ignored when deploying a stack in swarm mode with a (version 3) Compose file. The docker stack command accepts only pre-built images.

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

使用docker build命令创建docker图像;将创建的镜像推送到(public or private)docker registry;并在您的 docker compose 文件中引用它。

撰写文件提供两种工具:docker-compose cli 和 docker stack cli。 "build" 选项适用于 docker-compose 但被堆栈命令忽略,"deploy" 选项适用于堆栈命令但被 docker-compose.

忽略

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

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

如果有人还在使用它,您可以通过设置图像参数和构建参数来在 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