Cómo configurar las capacidades de Linux en invocaciones de servicio en modo enjambre de docker

Estoy investigando la noción de que vault se ejecute bajo swarm (1.12.x).

Un solo contenedor se iniciaría con: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

pero cuando quiero ejecutar esto en swarm como servicio, parece que no hay forma de especificar el IPC_LOCK capacidad, para bloquear el intercambio cifrado para el servicio de bóveda en este caso.

Cómo puedo establecer banderas cap cap-add al iniciar un servicio en modo enjambre con el docker service create ¿mando?

A partir del 20.10, esto está disponible en docker service create con --cap-add:

$ docker service create --help...      --cap-add list                       Add Linux capabilities      --cap-drop list                      Drop Linux capabilities

O en un archivo de composición utilizado con docker stack deploy con la misma sintaxis del archivo de la versión 2:

version: "3.9"services:  app:    image: your-image:tag    cap_add:    - CAP_NAME1    - CAP_NAME2    cap_drop:    - CAP_NAME3    - CAP_NAME4

[Respuesta original de antes de las 20.10 ]

Actualmente no es compatible, pero Docker está trabajando en una solución. La lógica detrás de no incluir el --cap-add si ciegamente se encuentra en un clúster grande, podría haber problemas de seguridad de que un administrador envíe contenedores con privilegios adicionales a un trabajador. El trabajador puede confiar en la ejecución de contenedores seguros que no pueden acceder al host, pero no desea permitir el acceso raíz remoto al host a través de un contenedor privilegiado.

La discusión sobre esto ha terminado en github en:

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 y https://github.com/docker/cli/pull/2199

Todas las demás respuestas aquí son antiguas. Ventana acoplable 20.10.0 y nuevos ahora es compatible con la especificación de capacidades para servicios de enjambre a través de la docker service línea de comandos y el Formato de archivo Docker Stack YAML.

En la línea de comandos, simplemente especifique --cap-add [capability] o --cap-drop [capability].

Y aquí hay un ejemplo para agregar una capacidad en un archivo YAML de Docker Stack:

version: "3.9"services:  your-service:    cap_add:      - CAP_SYS_ADMIN

Encontré una solución para resolver el problema y puedo usar cap_net_admin en modo enjambre.

Puede modificar el código fuente de tiempo de ejecución para agregar las capacidades que necesita (será una configuración predeterminada local).

Por ejemplo, agregué el CAP_NET_ADMIN a mi tiempo de ejecución (usado nvidia-container-runtime)wanyvic / nvidia-tiempo de ejecución de contenedores.

Después de eso lo reconstruí, inicié un contenedor (uso el modo de enjambre), ingresé: capsh --print y se puede encontrar CAP_NET_ADMIN:

root@25303a54ebb3:/# capsh --printCurrent:=cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_admin,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+eipBounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_admin,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcapSecurebits: 00/0x0/1'b0 secure-noroot: no (unlocked) secure-no-suid-fixup: no (unlocked) secure-keep-caps: no (unlocked)uid=0(root)gid=0(root)groups=

Pero este método no es bueno.

Tampoco puedo establecer cap_add o cap_drop en docker-compose.yml, pero no encuentro la manera de resolverlo.

Ver https://hub.docker.com/r/ixdotai/swarm-launcher

Ese repositorio se basa en este comentario / idea: https://github.com/moby/moby/issues/25885#issuecomment-573355530

Dependiendo del caso de uso, una solución alternativa es bind-mount /var/run/docker.sock desde el (los) host (es) de enjambre al servicio, luego ejecute docker run --privileged ... o docker run --cap-add ... desde el servicio para ejecutar sus comandos privilegiados reales. (Tendrás que instalar docker cli en la imagen para el servicio.) El contenedor más interno que ejecute Docker de esta manera tendrá los privilegios / capacidades del host de enjambre en lugar del servicio, y el servicio simplemente se convierte en una capa de contenedor delgada.