我正在将一些服务从Ubuntu18.04迁移到20.04。在18.04中,我在一个非根用户下运行这些服务。所有这些服务都启动了一个码头集装箱,而且它们运行得很好。在Ubuntu20.04下,这些服务不再启动。
为了说明,这里有一个非常简单的~/.config/systemd/user/hello-world.service
,它在Ubuntu18.04上运行得很好:
# -*-systemd-*-
[Unit]
Description=Hello world
After=network.service
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
TimeoutStartSec=0
ExecStartPre=/bin/echo user = $USER
ExecStartPre=/usr/bin/docker pull hello-world
ExecStart=/usr/bin/docker run \
--name hello-world \
--rm -a STDIN -a STDOUT -a STDERR \
hello-world
ExecStop=/usr/bin/docker stop -t 2 %n
[Install]
WantedBy=default.target
我直接以非根用户的身份在shell中运行容器,它在18.04机器和20.04机器上运行都很好:
/usr/bin/docker pull hello-world
/usr/bin/docker run \
--name hello-world \
--rm -a STDIN -a STDOUT -a STDERR \
hello-world
对于systemd,我运行以下命令:
systemctl --user enable hello-world.service
systemctl --user start hello-world.service
在Ubuntu18.04上,当我使用journalctl -xe -f
调查out时,一切都按预期运行。
在Ubuntu 20.04上,我感到恐惧:
Sep 15 14:56:26 m4 docker[107614]: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/images/create?fromImage=hello-world&tag=latest: dial unix /var/run/docker.sock: connect: permission denied
我检查了权限、组和一切似乎都是正确的。同样,如果我以username
身份登录时直接在命令行中运行对接器,那么docker就会运行得很好。
root@m4:/etc/apt> ll /var/run/docker.sock
srw-rw---- 1 root docker 0 Sep 15 14:08 /var/run/docker.sock=
root@m4:/etc/apt> grep docker /etc/group
docker:x:998:docker,username
唯一不同的是,18.04系统d在237版本,而20.04系统在245版本。
在这两台机器上,Docker是相同的:
Docker version 19.03.12, build 48a66213fe
这两个版本的systemd都显示在ExecStartPre
中回显的用户是我的非根用户。
看起来systemd 245是在错误的用户和/或组下启动停靠进程的。有什么想法吗?
正如@larsks建议的那样,我用/usr/bin/id
代替了D13
。以下是我收到的输出:
Sep 15 21:36:09 m4 id[122143]: uid=1001(username) gid=1001(username) groups=1001(username)
Sep 15 21:36:09 m4 docker[122144]: Using default tag: latest
Sep 15 21:36:09 m4 docker[122144]: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/images/create?fromImage=hello-world&tag=latest: dial unix /var/run/docker.sock: connect: permission denied
username
是docker
组的一部分,如上面所示。
发布于 2020-09-16 05:25:18
您的systemd用户单元没有指定Group=
,因此使用了用户的默认组。因为docker
不是默认的组,所以systemd不会用这个组启动进程。
在单元的Group=docker
部分中设置[Service]
。
发布于 2020-09-16 08:46:43
看看示例停靠容器单元文件,我相信至少缺少的是:
After=docker.socket
在单元文件的[Unit]
部分中,Delegate=yes
在[Service]
部分中,以便
这样,系统d就不会重置停靠容器的cgroup。
背景:
KillMode=process
所以
仅终止停靠进程,而不是终止cgroup中的所有进程。
对我来说也是个好主意。我建议查看链接的示例并相应地配置单元文件。
发布于 2020-09-16 17:23:51
原来是老式的重启解决了问题。:(
在此之前,我曾尝试重新启动systemd,但这并没有解决问题。我仍然不知道发生了什么,可能我在内核和系统配置中碰到了一些错误。
内核:5.4.0-47-generic #51-Ubuntu
系统d:
systemd 245 (245.4-4ubuntu3.2)
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=hybrid
https://serverfault.com/questions/1034059
复制相似问题