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

时间:2018-01-23 07:39:31

标签: docker docker-compose dockerfile docker-swarm

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

示例泊坞窗撰写文件......

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

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

  • 图像是在运行时根据db2server&存在的Docker文件构建的。 appruntime目录
  • 这些图像部署在主机上

但是当我们尝试在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中的堆栈部署期间忽略了'build'配置选项。

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

3 个答案:

答案 0 :(得分:13)

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

来自docs

  

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

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

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

答案 1 :(得分:6)

如果仍然有人在其中,则可以通过设置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

然后您可以做:

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

答案 2 :(得分:3)

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

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

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