Como esperar pelo docker no mod do usuário systemd?

3

Estou lançando contêineres do Docker (provavelmente com o link , que acabei de descobrir) em "systemd --user" arquivos unitários. Eu quero que eles sejam lançados no começo.

O problema é que você não pode fazer After=docker.service , porque as unidades do modo de usuário systemd não podem ver a unidade de modo do sistema systemd.

Alguém tem uma boa maneira de corrigir isso?

A melhor idéia que eu tive até agora é fazer uma unidade do tipo run-once que executa um script que sleep-loops até que "docker info" retorne algo razoável, e depois After = isso, mas isso parece hacky de um jeito ruim.

    
por rlpowell 17.11.2018 / 22:46

2 respostas

2

Uma boa solução para esse problema é ter o daemon do Docker (rodando na instância system do systemd) usando a ativação do soquete.

Dessa forma, quando você iniciar um comando docker (digamos de uma unidade systemd usuário ), ele terá um soquete para se conectar, mas bloqueará até que o daemon do Docker esteja realmente pronto para servir isso.

A ideia básica de ativação de soquete para elidir dependências explícitas é descrita em este artigo no blog do systemd , que fala sobre quatro serviços que tradicionalmente têm sido manipulados por meio de dependências explícitas, mas com a ativação de soquete não precisam mais que eles sejam configurados. Aqui está um trecho (é longo, mas realmente faz o ponto):

Socket activation makes it possible to start all four services completely simultaneously, without any kind of ordering. Since the creation of the listening sockets is moved outside of the daemons themselves we can start them all at the same time, and they are able to connect to each other's sockets right-away. I.e. in a single step the /dev/log and /run/dbus/system_bus_socket sockets are created, and in the next step all four services are spawned simultaneously. When D-Bus then wants to log to syslog, it just writes its messages to /dev/log. As long as the socket buffer does not run full it can go on immediately with what else it wants to do for initialization. As soon as the syslog service catches up it will process the queued messages. And if the socket buffer runs full then the client logging will temporarily block until the socket is writable again, and continue the moment it can write its log messages. That means the scheduling of our services is entirely done by the kernel: from the userspace perspective all services are run at the same time, and when one service cannot keep up the others needing it will temporarily block on their request but go on as soon as these requests are dispatched. All of this is completely automatic and invisible to userspace. Socket activation hence allows us to drastically parallelize start-up, enabling simultaneous start-up of services which previously were thought to strictly require serialization. Most Linux services use sockets as communication channel. Socket activation allows starting of clients and servers of these channels at the same time.

O daemon do Docker suporta a ativação de sockets desde , por isso é provável que a versão que você está usando já suporte .

Verifique se sua distribuição envia uma unidade docker.socket . Nesse caso, tudo o que você precisa fazer é ativá-la.

Se o daemon do Docker oferecer suporte à ativação de soquete, mas sua distribuição não incluir uma unidade docker.socket , dê uma olhada em este tutorial para instruções sobre como configurá-lo.

Mais uma alternativa a considerar é mudar do Docker para o podman .

O Podman tenta ser um substituto compatível com o Docker (assim, você pode usar as mesmas linhas de comando, simplesmente substituindo docker por podman .)

A principal diferença entre eles é que o podman não precisa de um daemon, então você não precisa esperar que um esteja pronto antes de iniciar um contêiner. O Podman está disponível como um pacote nas versões mais recentes das distribuições do Linux. Isso e o fato de que você pode usá-lo da mesma maneira que usa docker hoje deve facilitar a introdução.

    
por 18.11.2018 / 00:13
0

A propósito, em vez de executar containers com o systemd, eu pulo essa exigência com o docker-systemctl-replacement

Nesse contexto, o modo de usuário tem um significado diferente, pois o contêiner é executado com uma configuração "USER=", que empurra todos os processos para um proprietário que não seja raiz. É uma exigência de algumas implementações do docker-cloud - exemplos podem ser encontrados em docker-systemctl-images

    
por 20.11.2018 / 13:39