Docker stack文件中的cap_add和device选项无效

79次阅读
没有评论

问题描述

在使用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命令启动容器。

请注意,这种方法需要你自己编写脚本,并确保脚本在容器启动时被执行。

以上是几种解决方案供你参考。根据你的具体需求选择适合的方法。

正文完