我正在研究在 swarm (1.12.x) 下运行的保险库的概念。
单个容器将以以下方式启动:
docker run -d --cap-add IPC_LOCK -p 8200:8200 -p 8215:8125 --name vault --volume /vagrant/vault:/vagrant/vault vault server -config=/path/to/vault.hcl
但是当我想在 swarm 中将其作为服务运行时,似乎无法指定IPC_LOCK
功能,以便在这种情况下锁定 Vault 服务的加密交换。
使用命令启动群模式服务时如何设置 --cap-add 标志docker service create
?
从 20.10 开始,可通过以下方式
docker service create
获得--cap-add
:或者在使用与
docker stack deploy
版本 2 文件相同语法的 compose 文件中:[ 20.10 之前的原始答案 ]
目前不支持,但 Docker 正在研究解决方案。不盲目包含该
--cap-add
选项背后的逻辑是在大型集群中,管理员向工作人员提交具有附加权限的容器可能存在安全问题。工作人员可能信任正在运行的无法访问主机的安全容器,但不希望通过特权容器允许远程根访问主机。关于这个的讨论已经在 github 上结束了:
https://github.com/docker/docker/pull/26849#issuecomment-252704844
https://github.com/docker/swarmkit/issues/1030
https://github.com/docker/swarmkit/pull/1722
https://github.com/moby/moby/issues/25885#issuecomment-557790402和https://github.com/docker/cli/pull/2199
这里的所有其他答案都是旧的。Docker 20.10.0 和更新版本现在支持通过
docker service
命令行和Docker Stack YAML 文件格式为 Swarm 服务指定功能。在命令行上,您只需指定
--cap-add [capability]
or--cap-drop [capability]
。下面是在 Docker Stack YAML 文件中添加功能的示例:
我找到了解决问题的方法,我可以
cap_net_admin
在 swarm 模式下使用。您可以修改运行时源代码以添加您需要的功能(这将是本地默认设置)。
例如,我将wanyvic/nvidia-container-runtime
CAP_NET_ADMIN
添加到我的运行时(使用nvidia-container-runtime
) 。之后我重建了它,启动了一个容器(使用 swarm 模式),输入:
capsh --print
和 CAP_NET_ADMIN 可以找到:但这种方法并不好。
我也无法设置
cap_add
orcap_drop
indocker-compose.yml
,但我找不到解决方法。见https://hub.docker.com/r/ixdotai/swarm-launcher
该回购基于此评论/想法:https ://github.com/moby/moby/issues/25885#issuecomment-573355530