Como definir recursos do Linux em invocações de serviço do modo docker swarm

Estou olhando para a noção de cofre correndo sob enxame (1.12.x).

Um único contêiner seria iniciado com: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

mas quando eu quero executar isso no swarm como um serviço, parece não haver Como especificar o IPC_LOCK capacidade, a fim de bloquear a troca criptografada pelo serviço vault neste caso.

Como posso definir --cap-adicionar sinalizadores ao iniciar um serviço de modo de enxame com o docker service create comando?

A partir de 20.10, isso está disponível a partir de docker service create com --cap-add:

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

Ou em um arquivo de composição usado com docker stack deploy com a mesma sintaxe do arquivo da versão 2:

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

[Resposta Original antes das 20h10 ]

Atualmente não é suportado, mas o Docker está trabalhando em uma solução. A lógica por trás de não incluir o --cap-add a opção cegamente está em um cluster grande, pode haver preocupações de segurança de um gerente que envia contêineres com privilégios adicionais a um trabalhador. O trabalhador pode confiar na execução de contêineres seguros que não podem acessar o host, mas não desejam permitir o acesso remoto root ao host por meio de um contêiner privilegiado.

A discussão sobre isso acabou no github em:

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

Todas as outras respostas aqui são antigas. Encaixe 20.10.0 e mais recente agora suporta a especificação de recursos para Serviços Swarm através do docker service comando e o Docker Stack YAML formato de arquivo.

Na linha de comando, basta especificar --cap-add [capability] ou --cap-drop [capability].

E aqui está um exemplo para adicionar um recurso em um arquivo YAML de pilha do Docker:

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

Encontrei uma solução para resolver o problema e posso usar cap_net_admin no modo enxame.

Você pode modificar o código-fonte do tempo de execução para adicionar os recursos necessários (será uma configuração padrão local).

Por exemplo, adicionei o CAP_NET_ADMIN para o meu tempo de execução (usado nvidia-container-runtime)wanyvic / nvidia-container-tempo de execução.

Depois disso, reconstruí - o, iniciei um contêiner( use o modo swarm), entrada: capsh --print e CAP_NET_ADMIN pode ser encontrado:

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=

Mas esse método não é bom.

Eu também não consigo definir cap_add ou cap_drop em docker-compose.yml, mas não consigo encontrar uma maneira de resolvê-lo.

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

Esse repo é baseado neste comentário / ideia: https://github.com/moby/moby/issues/25885#issuecomment-573355530

Dependendo do caso de uso, uma solução alternativa é vincular-montar /var/run/docker.sock do(s) host (s) do enxame ao serviço e, em seguida, execute docker run --privileged ... ou docker run --cap-add ... do serviço para executar seus comandos privilegiados reais. (Você terá que instalar o docker cli na imagem do serviço.) O contêiner mais interno executado pelo docker dessa maneira terá os privilégios / recursos do host swarm em vez do serviço, e o serviço se tornará uma camada fina de contêiner.