Docker-compose无效.不允许使用其他属性



这是我的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时,我得到:

错误:撰写文件'./docker-撰写。
networks.labnet.io.ipam。不允许附加属性('gateway'是意外的)
networks.labnet。不允许附加属性('name'是意外的)

我认为这个问题是由于你没有缩进"网络"造成的。财产。

我曾经得到"(根)不允许附加属性代理",但缩进解决了这个问题。

v3语法中不支持gateway字段:

额外的IPAM配置,如网关,目前只支持版本2。

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

然而,在容器上设置静态ip是一种强烈的代码气味,它表明您试图将容器视为小型vm,这是使用容器的错误设计。设置容器名称也是如此。这样做会破坏更新容器而不出现某种中断的能力,因为您必须停止旧容器并删除它以释放IP和名称。除非你需要特权,否则我也会把它去掉。如果不需要对ssh密钥进行写访问,那么只挂载只读的ssh密钥。我会将命令移动到您的图像定义的一部分。您应该使用您的hub用户名(或本地注册表)定义映像名称。结果如下:

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 Mode,这就是版本3语法的原因。如果你不需要支持蜂群模式,那么版本2格式可能更适合你的用例。

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

但是,正如BMitch提到的,如果需要支持群集模式,字段网关不能在复合文件中,因为在版本3语法中不支持。


我在1.25.5版本的docker-compose中遇到了同样的问题,但在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"
}
]
},
...

最新更新