Docker群:在堆栈部署期间忽略docker中的“构建”配置文件

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

我们创建了具有多个服务的docker compose文件。 这些服务的映像是在运行时使用" build"配置选项构建的。 相应的Dockerfile在各自的目录中给出。

样本Docker撰写文件...

1
2
3
4
5
6
7
8
9
10
11
version: '3'
services:
  db2server:
    build: ./db2server
    ports:
      -"50005:50000"
    command: ["db2start"]
  appruntime:
    build: ./appruntime
    depends_on:
     - db2server

该docker compose文件可与docker-compose命令一起使用。

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

但是,当我们尝试将其部署在Docker群中时,会引发以下错误...

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

1
2
3
4
5
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中的堆栈部署期间会忽略" build"配置选项。

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


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

从文档:

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.

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

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


如果仍然有人在其中,则可以通过设置image参数和build参数来标记compose中的构建图像,如在文档的build部分中所见。因此文件应如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
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

那么您可以执行以下操作:

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


撰写文件可同时使用以下两个工具:docker-compose cli和docker stack cli。" build"选项在docker-compose中起作用,但是被堆栈命令忽略,而" deploy"选项在堆栈命令中起作用,但被docker-compose忽略。

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

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