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

din*_*p24 14 docker dockerfile docker-compose docker-swarm

我们创建了一个包含多个服务的docker compose文件.这些服务的映像使用"build"配置选项在运行时构建.相应的Dockerfile在相应的目录中给出.

示例docker撰写文件...

version: '3'
services:
  db2server:
    build: ./db2server
    ports:
      - "50005:50000"
    command: ["db2start"]
  appruntime:
    build: ./appruntime
    depends_on:
     - db2server
Run Code Online (Sandbox Code Playgroud)

此docker compose文件与docker-compose命令一起使用.

  • 图像是在运行时根据db2server&appruntime目录中存在的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
Run Code Online (Sandbox Code Playgroud)

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

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

Fra*_*rel 13

简短的回答是,你不能使用build命令docker stack deploy.

来自文档:

注意:使用(版本3)Compose文件在swarm模式下部署堆栈时,将忽略该docker stack命令build选项.该docker stack命令仅接受预先构建的图像.

另一种方法是在部署群集群集之前构建docker镜像.

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

  • 我发现构建、推送镜像对于小的开发修改来说非常耗时,是否有更省时的替代方案? (4认同)

Bre*_*her 10

撰写文件提供两种工具:docker-composecli 和docker stackcli。“构建”选项在docker-compose堆栈命令中起作用但被堆栈命令忽略,“部署”选项在堆栈命令中起作用但被docker-compose.

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

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


vli*_*ana 9

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

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
Run Code Online (Sandbox Code Playgroud)

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

docker-compose build
docker-compose push
docker stack deploy -c /home/docker/docker-compose.yml app
Run Code Online (Sandbox Code Playgroud)