问题描述
在使用Docker stack文件启动容器时,尝试使用cap_add和device选项,但是在部署时遇到了错误。错误信息如下:
$ docker stack deploy -c docker-stack.yml vpnproxyservices.vpn_proxy.deploy Additional property cap_add is not allowed
$ docker stack deploy -c docker-stack.yml vpnproxyservices.vpn_proxy.deploy Additional property device is not allowed
以下是用户的stack文件内容:
version: "3.9"
services:
vpn_proxy:
image: ciasto/alpine-myvpn-proxy:v1
volumes:
- /etc/openvpn:/etc/openvpn
- /etc/haproxy:/etc/haproxy
networks:
- vpn_proxy_frontend
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
cap_add: NET_ADMIN
device: /dev/net/tun
placement:
constraints:
- "node.hostname==rockpix"
networks:
vpn_proxy_frontend:
用户想知道自己做错了什么。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
解决方案1
在Docker Swarm模式下,部署stack时会忽略cap_add和device选项。这是正常的行为。你可以在以下链接的Notes部分找到更多信息:
– https://docs.docker.com/compose/compose-file/compose-file-v3/#cap_add-cap_drop
– https://docs.docker.com/compose/compose-file/compose-file-v3/#devices
解决方案2
如果你需要在Docker Swarm模式下使用cap_add和device选项,你可以考虑使用Docker service命令来手动启动容器。以下是一个示例命令:
docker service create --name vpn_proxy \
--mount type=bind,source=/etc/openvpn,target=/etc/openvpn \
--mount type=bind,source=/etc/haproxy,target=/etc/haproxy \
--network vpn_proxy_frontend \
--constraint 'node.hostname==rockpix' \
--cap-add NET_ADMIN \
--device /dev/net/tun \
ciasto/alpine-myvpn-proxy:v1
在上面的示例中,我们使用docker service create
命令手动创建一个服务,并指定了需要的选项。你可以根据自己的需求修改命令中的参数。
请注意,使用Docker service命令手动启动容器可能会增加一些复杂性,并且需要确保容器的依赖关系正确设置。
解决方案3
另一种方法是将cap_add和device选项移动到容器的启动脚本中。你可以在容器启动时使用脚本来设置这些选项。以下是一个简单的示例:
#!/bin/bash
# 启动容器前设置cap_add和device选项
docker run -d --name vpn_proxy \
--cap-add NET_ADMIN \
--device /dev/net/tun \
ciasto/alpine-myvpn-proxy:v1
在这个示例中,我们使用一个启动脚本来设置cap_add和device选项,并使用docker run
命令启动容器。
请注意,这种方法需要你自己编写脚本,并确保脚本在容器启动时被执行。
以上是几种解决方案供你参考。根据你的具体需求选择适合的方法。