【问题标题】:Docker-compose invalid. Additional properties are not allowedDocker-compose 无效。不允许附加属性
【发布时间】:2021-11-18 20:45:54
【问题描述】:

这是我的 docker-compose.yml

version: "3.0"
services:
  control_node:
      hostname: controlnode
      container_name: controlnode
      build: ./control_node/
      command: tail -F anything
      privileged: true
      volumes:
      - ${CONTROL_NODE_SSH}:/home/ansible/.ssh
      - ${SHARED_FOLDER}:/shared
      networks:   
        labnet.io:
            ipv4_address: 10.10.0.2

  ubuntu-a:
      hostname: ubuntu-a   
      container_name: ubuntu-a
      build: ./ubuntu/
      command: tail -F anything
      ports:
      - ${UBUNTU_A_WEBSERVER_PORT}:80
      privileged: true
      volumes:
      - ${UBUNTU_A_SSH}:/home/ansible/.ssh
      - ${SHARED_FOLDER}/shared:/shared
      networks:   
        labnet.io:
            ipv4_address: 10.10.0.3

  ubuntu-b:
      hostname: ubuntu-b   
      container_name: ubuntu-b
      build: ./ubuntu/
      command: tail -F anything
      ports:
      - ${UBUNTU_B_APPSERVER_PORT}:8080
      privileged: true
      volumes:
      - ${UBUNTU_B_SSH}:/home/ansible/.ssh
      - ${SHARED_FOLDER}/shared:/shared
      networks:   
        labnet.io:
            ipv4_address: 10.10.0.4

  ubuntu-c:
      hostname: ubuntu-c   
      container_name: ubuntu-c
      build: ./ubuntu/
      command: tail -F anything
      ports:
      - ${UBUNTU_C_WEBSERVER_PORT}:80
      privileged: true
      volumes:
      - ${UBUNTU_C_SSH}:/home/ansible/.ssh
      - ${SHARED_FOLDER}/shared:/shared
      networks:   
        labnet.io:
            ipv4_address: 10.10.0.5

  ubuntu-d:
      hostname: ubuntu-d   
      container_name: ubuntu-d
      build: ./ubuntu/
      command: tail -F anything
      ports:
      - ${UBUNTU_D_APPSERVER_PORT}:8080
      privileged: true
      volumes:
      - ${UBUNTU_D_SSH}:/home/ansible/.ssh
      - ${SHARED_FOLDER}/shared:/shared
      networks:   
        labnet.io:
            ipv4_address: 10.10.0.6

networks:   
  labnet.io:
    name: labnet.io
    driver: bridge
    ipam:
     config:
       - subnet: 10.10.0.0/16
         gateway: 10.10.0.1

当我运行docker-compose up -d 时,我得到:

错误:Compose 文件“./docker-compose.yml”无效,因为:
networks.labnet.io.ipam.config 值 不允许附加属性(“网关”是意外的)
networks.labnet.io 值 不允许附加属性('name' 是意外的)

【问题讨论】:

  • 来自 docker-compose v3 上的文档:“其他 IPAM 配置,例如网关,目前仅适用于版本 2。”
  • 解决此问题的最简单方法是删除文件中的所有 networks: 块。撰写将create a network named default and assign IP addresses for you。同样,您通常不需要设置hostname:container_name:,通常可以不设置command: 以使用Dockerfile 中的CMD

标签: docker docker-compose dockerfile


【解决方案1】:

编辑: 1.27.0+ 版本合并了 v2/v3 文件格式,您可以在 https://github.com/docker/compose/releases 中看到 因此,version 属性现在只是提供信息。

但是,正如 BMitch 所提到的,如果需要支持 swarm 模式,则字段网关不能在 compose-file 中,因为版本 3 语法不支持。


我在 docker-compose 版本 1.25.5 中遇到了同样的问题,但在 1.29.2 中不再存在。

version: '3'
networks:
        nginx_net:
                driver: bridge
                ipam:
                        driver: default
                        config:
                                - gateway: "192.168.0.254"
                                  subnet: "192.168.0.0/24"

...

docker network inspect compose_nginx_net
[
    {
        "Name": "compose_nginx_net",
        "Id": "2137c736e0c56d90cbc657a6a9f819a117edb273fdde1a4963ee68769901d368",
        "Created": "2021-12-12T14:42:15.33387384Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "192.168.0.0/24",
                    "Gateway": "192.168.0.254"
                }
            ]
        },
...

【讨论】:

  • 根据版本 3 规范,它仍然是无效的撰写文件。不同的是,新版本的 compose 完全忽略了该版本,但是如果您使用旧版本的 compose 运行它或使用 swarm 模式部署(v3 背后的原因),您将遇到错误。
  • 谢谢,BMitch。刚刚开始在这个 docker 世界。不过,在我看来这是一件好事,因为知道 1.27.0+ 版本已经合并了 v2/v3 文件格式。 version 属性现在只是提供信息,对吧?
  • 取决于您是否只想支持在您自己的机器上运行的撰写文件,或者您是否需要支持它们在您不控制撰写版本的其他机器上运行,特别是如果您想要支持群模式。如果您不需要支持 swarm 模式,则没有理由使用版本 3。
  • 明白。谢谢。已将答案编辑为更准确。
【解决方案2】:

在 v3 语法中,不支持网关字段:

其他 IPAM 配置(例如网关)目前仅适用于版本 2。

来源:https://docs.docker.com/compose/compose-file/compose-file-v3/#ipam

但是,在容器上设置静态 IP 会产生强烈的代码异味,这表明您试图将容器视为小型虚拟机,这是使用容器的错误设计。设置容器名称也是如此。这样做会破坏在不中断的情况下更新容器的能力,因为您必须停止旧容器并将其删除以释放 IP 和名称。除非您需要特权,否则我也会删除它。如果您不需要对 ssh 密钥的写访问权,则只安装那些只读的。我会将命令移动到您的图像定义中。您应该使用您的中心用户名(或本地注册表)定义您的图像名称。结果如下:

version: "3.0"
services:
  control_node:
      image: username/control:latest
      build: ./control_node/
      volumes:
      - ${CONTROL_NODE_SSH}:/home/ansible/.ssh:ro
      - ${SHARED_FOLDER}:/shared

  ubuntu-a:
      image: username/ubuntu:latest
      build: ./ubuntu/
      ports:
      - ${UBUNTU_A_WEBSERVER_PORT}:80
      volumes:
      - ${UBUNTU_A_SSH}:/home/ansible/.ssh:ro
      - ${SHARED_FOLDER}/shared:/shared

  ubuntu-b:
      image: username/ubuntu:latest
      build: ./ubuntu/
      ports:
      - ${UBUNTU_B_APPSERVER_PORT}:8080
      volumes:
      - ${UBUNTU_B_SSH}:/home/ansible/.ssh:ro
      - ${SHARED_FOLDER}/shared:/shared

  ubuntu-c:
      image: username/ubuntu:latest
      build: ./ubuntu/
      ports:
      - ${UBUNTU_C_WEBSERVER_PORT}:80
      volumes:
      - ${UBUNTU_C_SSH}:/home/ansible/.ssh:ro
      - ${SHARED_FOLDER}/shared:/shared

  ubuntu-d:
      image: username/ubuntu:latest
      build: ./ubuntu/
      ports:
      - ${UBUNTU_D_APPSERVER_PORT}:8080
      volumes:
      - ${UBUNTU_D_SSH}:/home/ansible/.ssh:ro
      - ${SHARED_FOLDER}/shared:/shared

最后,我要补充一点,您尝试做的许多事情似乎不适用于 Swarm 模式,这就是版本 3 语法的原因。如果您不需要支持 Swarm 模式,那么其中一种 version 2 格式可能更适合您的用例。

【讨论】:

  • 当我运行你的版本时,我得到:错误:命名卷 "${HOME}/ansible-lab/ssh/control_node:/home/ansible/.ssh:ro" is used in service " control_node”,但未在卷部分找到声明。
  • @user17007397 ${HOME} 是从哪里来的?
猜你喜欢
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 2021-12-24
  • 1970-01-01
相关资源
最近更新 更多