I'm looking into the notion of vault running under swarm (1.12.x).
A single container would be started with:
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
but when I want to run this in swarm as a service, there appears to be no way to specify the IPC_LOCK
capability, in order to lock down encrypted swapping for the vault service in this case.
How can I set --cap-add flags when starting a swarm mode service with the docker service create
command?
As of 20.10, this is available from
docker service create
with--cap-add
:Or in a compose file used with
docker stack deploy
with the same syntax from the version 2 file:[ Original answer from before 20.10 ]
It's currently not supported, but Docker is working on a solution. The logic behind not including the
--cap-add
option blindly is in a large cluster, there could be security concerns of a manager submitting containers with added privileges to a worker. The worker may trust running secure containers that can't access the host, but not want to allow remote root access to the host via a privileged container.Discussion on this is over on github at:
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 and https://github.com/docker/cli/pull/2199
All of the other answers here are old. Docker 20.10.0 and newer now supports specifying capabilities for Swarm services via the
docker service
command line and the Docker Stack YAML file format.On the command line, you just specify
--cap-add [capability]
or--cap-drop [capability]
.And here is an example for adding a capability in a Docker Stack YAML file:
I found a solution to solve the problem and I can use
cap_net_admin
in swarm mode.You can modify the runtime source code to add the capabilities that you need (it will be a local default setting).
For example I added the
CAP_NET_ADMIN
to my runtime (usednvidia-container-runtime
) wanyvic/nvidia-container-runtime.After that I rebuilt it, started a container (use swarm mode), input:
capsh --print
and CAP_NET_ADMIN can be found:But this method is not good.
I also can't set
cap_add
orcap_drop
indocker-compose.yml
, but I can't find a way to solve it.See https://hub.docker.com/r/ixdotai/swarm-launcher
That repo is based on this comment/idea: https://github.com/moby/moby/issues/25885#issuecomment-573355530