系统用户无法获得用户组的能力


8

我在docker组中添加了一个非root用户,并在此非root用户连接到docker守护程序时运行了其他服务。但该服务无法正常工作。我为此做一个测试示例:

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

在Tiger中创建系统服务:

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

/home/tiger/connectdocker这样的:

docker run -itd busybox 2> connectdocker.log

启动此服务:

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

结果:

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

但是我可以用tiger连接到docker.sock:

tiger@# docker run -itd busybox
997e99f959cfd5500319935ec17677775da9d367d203a11efef8b42161c3ee64

为了证明这一点,我将/var/run/docker.sock组从docker 更改为Tiger,并且connectdocker服务可以连接到docker守护程序。

变化/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

1
你有没有做这个工作?
马克·斯托斯伯格

Answers:


1

您应该User=systemd服务中使用指令。

用户=,组=

分别设置执行进程的UNIX用户或组。以单个用户或组名或数字ID作为参数。对于系统服务(由系统服务管理器运行的服务,即由PID 1管理)和对于根用户的用户服务(由systemd --user的根实例管理的服务),默认值为“ root”,但是User =用于指定其他用户。对于任何其他用户的用户服务,不允许切换用户身份,因此唯一有效的设置是用户服务管理器所运行的同一用户。如果未设置任何组,则使用用户的默认组。此设置不会影响命令行前缀为“ +”的命令。

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

我还建议将您的脚本从主目录移动到标准路径,/usr/local/bin诸如此类。

您还应该connectdocker.service通过给After=docker.service和来确保顺序Requires=docker.service。在撰写本文时,connectdocker.service它可能试图与大约在同一时间启动docker.service,并且您需要等待docker.service启动后才能连接到它。

需要=

配置对其他单元的需求依赖性。如果激活了本机,此处列出的单元也将被激活。如果其他单元之一被停用或激活失败,则该单元将被停用。可以多次指定此选项,也可以在一个选项中指定多个以空格分隔的单位,在这种情况下,将为所有列出的名称创建需求依存关系。请注意,需求依赖关系不会影响服务启动或停止的顺序。必须使用After =或Before =选项独立配置。如果单元foo.service需要使用Requires =配置的单位bar.service,并且没有通过After =或Before =配置的顺序,则如果激活了foo.service,则这两个单元将同时启动并且彼此之间没有任何延迟。经常,

请注意,此依赖关系类型并不意味着当该单元运行时,另一个单元始终必须处于活动状态。具体来说:条件检查失败(例如ConditionPathExists =,ConditionPathExists =,…—参见下文)不会导致依赖于Requires =的单元的启动作业失败。同样,某些单元类型可能会自行停用(例如,服务进程可能决定完全退出,或者用户拔出设备的电源),这不会传播到具有Requires =依赖关系的单元。结合使用BindsTo =依赖类型和After =可以确保没有特定的其他单元也处于活动状态时,一个单元永远不会处于活动状态(请参见下文)。

请注意,也可以通过在单元文件随附的.requires /目录中添加符号链接,在单元配置文件外部配置此类依赖项。有关详细信息,请参见上文。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.