Der Benutzer systemd kann die Fähigkeit der Benutzergruppe nicht abrufen

8

Ich habe einen Nicht-Root-Benutzer in der Docker-Gruppe hinzugefügt und einen anderen Dienst ausgeführt, während dieser Nicht-Root-Benutzer eine Verbindung zum Docker-Daemon herstellt. aber der service kann nicht funktionieren. Ich mache ein Testbeispiel dafür:

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

Erstellen Sie einen System-Service in Tiger:

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

das /home/tiger/connectdockerwie folgt:

docker run -itd busybox 2> connectdocker.log

Starten Sie diesen Dienst:

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

und das Ergebnis:

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

aber ich kann mich mit tiger mit docker.sock verbinden:

tiger@# docker run -itd busybox
997e99f959cfd5500319935ec17677775da9d367d203a11efef8b42161c3ee64

Um dies zu beweisen, ändere ich die /var/run/docker.sockGruppe von Docker zu Tiger, und der Connectdocker-Dienst kann eine Verbindung zum Docker-Daemon herstellen.

Änderung /var/run/docker.sock:

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

zu:

ls -l /run/docker.sock
srw-rw---- 1 root tiger 0 Jul 21 00:33 /run/docker.sock
Yongsu Zhang
quelle
1
Hast du das jemals zum Laufen gebracht?
Mark Stosberg

Antworten:

1

Sie sollten die User=Richtlinie in Ihrem systemdDienst verwenden.

Benutzer =, Gruppe =

Legen Sie den UNIX-Benutzer oder die UNIX-Gruppe fest, als die die Prozesse ausgeführt werden. Nimmt einen einzelnen Benutzer- oder Gruppennamen oder eine numerische ID als Argument. Für Systemdienste (Dienste, die vom Systemdienstmanager ausgeführt werden, dh von PID 1 verwaltet werden) und für Benutzerdienste des Root-Benutzers (Dienste, die von der Root-Instanz von systemd --user verwaltet werden) lautet der Standardwert "root", aber User = may verwendet werden, um einen anderen Benutzer anzugeben. Für Benutzerdienste eines anderen Benutzers ist das Wechseln der Benutzeridentität nicht zulässig. Daher ist die einzig gültige Einstellung derselbe Benutzer, unter dem der Dienstmanager des Benutzers ausgeführt wird. Wenn keine Gruppe festgelegt ist, wird die Standardgruppe des Benutzers verwendet. Diese Einstellung wirkt sich nicht auf Befehle aus, deren Befehlszeile "+" vorangestellt ist.

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

Ich würde auch empfehlen, Ihr Skript von einem Home-Verzeichnis in einen Standardpfad /usr/local/binoder ähnliches zu verschieben.

Sie sollten auch die Bestellung Ihres sicherstellen, connectdocker.serviceindem Sie ihm das After=docker.serviceund geben Requires=docker.service. Wie geschrieben connectdocker.servicesteht, versucht der wahrscheinlich, ungefähr zur gleichen Zeit wie der zu starten docker.service, und Sie müssen warten, docker.servicebis er aktiv ist, bevor Sie eine Verbindung herstellen können.

Benötigt =

Konfiguriert Anforderungsabhängigkeiten von anderen Einheiten. Wenn diese Einheit aktiviert wird, werden auch die hier aufgeführten Einheiten aktiviert. Wenn eine der anderen Einheiten deaktiviert wird oder ihre Aktivierung fehlschlägt, wird diese Einheit deaktiviert. Diese Option kann mehrmals angegeben werden, oder es können mehrere durch Leerzeichen getrennte Einheiten in einer Option angegeben werden. In diesem Fall werden Anforderungsabhängigkeiten für alle aufgelisteten Namen erstellt. Beachten Sie, dass Anforderungsabhängigkeiten keinen Einfluss auf die Reihenfolge haben, in der Dienste gestartet oder gestoppt werden. Dies muss unabhängig mit den Optionen After = oder Before = konfiguriert werden. Wenn für eine Einheit foo.service eine Einheit erforderlich ist, die mit Requires = konfiguriert ist, und keine Bestellung mit After = oder Before = konfiguriert ist, werden beide Einheiten gleichzeitig und ohne Verzögerung zwischen ihnen gestartet, wenn foo.service aktiviert ist. Häufig,

Beachten Sie, dass dieser Abhängigkeitstyp nicht bedeutet, dass die andere Einheit immer aktiv sein muss, wenn diese Einheit ausgeführt wird. Insbesondere: Fehlgeschlagene Bedingungsprüfungen (z. B. ConditionPathExists =, ConditionPathExists =,… - siehe unten) führen nicht dazu, dass der Startjob einer Einheit mit der Abhängigkeit Requires = fehlschlägt. Einige Einheitentypen können auch von selbst deaktiviert werden (z. B. kann ein Serviceprozess entscheiden, sauber zu beenden, oder ein Gerät kann vom Benutzer getrennt werden), was nicht an Einheiten mit einer Abhängigkeit von Requires = weitergegeben wird. Verwenden Sie den Abhängigkeitstyp BindsTo = zusammen mit After =, um sicherzustellen, dass sich eine Einheit niemals im aktiven Zustand befindet, ohne dass sich eine bestimmte andere Einheit ebenfalls im aktiven Zustand befindet (siehe unten).

Beachten Sie, dass Abhängigkeiten dieses Typs auch außerhalb der Gerätekonfigurationsdatei konfiguriert werden können, indem ein Symlink zu einem Verzeichnis hinzugefügt wird, das der Gerätedatei beiliegt. Einzelheiten siehe oben.

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

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

Centimane
quelle