l'utilisateur systemd ne peut pas obtenir la capacité du groupe d'utilisateurs

8

J'ai ajouté un utilisateur non root dans le groupe docker et un autre service exécuté lorsque cet utilisateur non root se connecte au démon docker. mais le service ne peut pas fonctionner. Je fais un exemple de test pour cela:

root@# systemctl start docker.service 
root@# gpasswd -a tiger docker

créer un service systemd dans tiger:

[Service]
ExecStart=/home/tiger/connectdocker
Restart=always
StartLimitInterval=0
Delegate=true
KillMode=process
[Install]
WantedBy=default.target

la /home/tiger/connectdockerprésente comme suit:

docker run -itd busybox 2> connectdocker.log

démarrer ce service:

tiger@# systemctl --user enable connectdocker.service
tiger@# systemctl --user start connectdocker.service

et le résultat:

Thu Jul 21 00:59:15 CST 2016
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

mais je peux me connecter à docker.sock avec tiger:

tiger@# docker run -itd busybox
997e99f959cfd5500319935ec17677775da9d367d203a11efef8b42161c3ee64

pour prouver cela, je change le /var/run/docker.sockgroupe de docker en tigre, et le service connectdocker peut se connecter au démon docker.

changer /var/run/docker.sock:

ls -l /run/docker.sock
srw-rw---- 1 root docker 0 Jul 21 00:33 /run/docker.sock

à:

ls -l /run/docker.sock
srw-rw---- 1 root tiger 0 Jul 21 00:33 /run/docker.sock
yongsu zhang
la source
1
Avez-vous déjà réussi à le faire fonctionner?
Mark Stosberg

Réponses:

1

Vous devez utiliser la User=directive dans votre systemdservice.

Utilisateur =, Groupe =

Définissez l'utilisateur ou le groupe UNIX sous lequel les processus sont exécutés, respectivement. Prend un seul nom d'utilisateur ou de groupe ou un ID numérique comme argument. Pour les services système (services gérés par le gestionnaire de services système, c'est-à-dire gérés par PID 1) et pour les services utilisateur de l'utilisateur root (services gérés par l'instance racine de systemd --user), la valeur par défaut est "root", mais User = may être utilisé pour spécifier un autre utilisateur. Pour les services utilisateur de tout autre utilisateur, le changement d'identité utilisateur n'est pas autorisé, par conséquent, le seul paramètre valide est le même utilisateur que le gestionnaire de services de l'utilisateur. Si aucun groupe n'est défini, le groupe par défaut de l'utilisateur est utilisé. Ce paramètre n'affecte pas les commandes dont la ligne de commande est préfixée par "+".

https://www.freedesktop.org/software/systemd/man/systemd.exec.html#User=

Je recommanderais également de déplacer votre script d'un répertoire personnel vers un chemin standard, similaire /usr/local/binou similaire.

Vous devez également assurer la commande de votre connectdocker.serviceen lui donnant le After=docker.serviceet Requires=docker.service. Comme il est écrit, le connectdocker.serviceest probablement en train de démarrer à peu près en même temps que le docker.service, et vous devrez attendre docker.servicequ'il soit en place avant de pouvoir vous y connecter.

Requiert =

Configure les dépendances d'exigence sur d'autres unités. Si cette unité est activée, les unités répertoriées ici seront également activées. Si l'une des autres unités est désactivée ou que son activation échoue, cette unité sera désactivée. Cette option peut être spécifiée plusieurs fois ou plusieurs unités séparées par des espaces peuvent être spécifiées dans une option, auquel cas des dépendances d'exigence pour tous les noms répertoriés seront créées. Notez que les dépendances d'exigence n'influencent pas l'ordre dans lequel les services sont démarrés ou arrêtés. Ceci doit être configuré indépendamment avec les options After = ou Before =. Si une unité foo.service nécessite une unité bar.service configurée avec Requiert = et qu'aucune commande n'est configurée avec After = ou Before =, les deux unités seront démarrées simultanément et sans délai entre elles si foo.service est activé. Souvent,

Notez que ce type de dépendance n'implique pas que l'autre unité doit toujours être en état actif lorsque cette unité est en cours d'exécution. Plus précisément: l'échec des vérifications de condition (telles que ConditionPathExists =, ConditionPathExists =,… - voir ci-dessous) n'entraîne pas l'échec du travail de démarrage d'une unité avec une dépendance Requiert =. De plus, certains types d'unités peuvent se désactiver d'eux-mêmes (par exemple, un processus de service peut décider de quitter proprement, ou un périphérique peut être débranché par l'utilisateur), ce qui n'est pas propagé aux unités ayant une dépendance Requiert =. Utilisez le type de dépendance BindsTo = avec After = pour vous assurer qu'une unité ne peut jamais être en état actif sans une autre unité spécifique également en état actif (voir ci-dessous).

Notez que les dépendances de ce type peuvent également être configurées en dehors du fichier de configuration d'unité en ajoutant un lien symbolique vers un répertoire .requires / accompagnant le fichier d'unité. Pour plus de détails, voir ci-dessus.

https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Requires=

https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Before=

Centimane
la source