首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >systemctl --用户无法在Ubuntu 20.04上启动停靠容器

systemctl --用户无法在Ubuntu 20.04上启动停靠容器
EN

Server Fault用户
提问于 2020-09-16 03:22:33
回答 3查看 3.1K关注 0票数 2

我正在将一些服务从Ubuntu18.04迁移到20.04。在18.04中,我在一个非根用户下运行这些服务。所有这些服务都启动了一个码头集装箱,而且它们运行得很好。在Ubuntu20.04下,这些服务不再启动。

为了说明,这里有一个非常简单的~/.config/systemd/user/hello-world.service,它在Ubuntu18.04上运行得很好:

代码语言:javascript
运行
复制
# -*-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机器上运行都很好:

代码语言:javascript
运行
复制
/usr/bin/docker pull hello-world
/usr/bin/docker run \
  --name hello-world \
  --rm -a STDIN -a STDOUT -a STDERR \
  hello-world

对于systemd,我运行以下命令:

代码语言:javascript
运行
复制
systemctl --user enable hello-world.service
systemctl --user start hello-world.service

在Ubuntu18.04上,当我使用journalctl -xe -f调查out时,一切都按预期运行。

在Ubuntu 20.04上,我感到恐惧:

代码语言:javascript
运行
复制
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就会运行得很好。

代码语言:javascript
运行
复制
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是相同的:

代码语言:javascript
运行
复制
Docker version 19.03.12, build 48a66213fe

这两个版本的systemd都显示在ExecStartPre中回显的用户是我的非根用户。

看起来systemd 245是在错误的用户和/或组下启动停靠进程的。有什么想法吗?

更新

正如@larsks建议的那样,我用/usr/bin/id代替了D13。以下是我收到的输出:

代码语言:javascript
运行
复制
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

usernamedocker组的一部分,如上面所示。

EN

回答 3

Server Fault用户

发布于 2020-09-16 05:25:18

您的systemd用户单元没有指定Group=,因此使用了用户的默认组。因为docker不是默认的组,所以systemd不会用这个组启动进程。

在单元的Group=docker部分中设置[Service]

票数 0
EN

Server Fault用户

发布于 2020-09-16 08:46:43

看看示例停靠容器单元文件,我相信至少缺少的是:

After=docker.socket在单元文件的[Unit]部分中,Delegate=yes[Service]部分中,以便

这样,系统d就不会重置停靠容器的cgroup。

背景:

KillMode=process

所以

仅终止停靠进程,而不是终止cgroup中的所有进程。

对我来说也是个好主意。我建议查看链接的示例并相应地配置单元文件。

票数 0
EN

Server Fault用户

发布于 2020-09-16 17:23:51

原来是老式的重启解决了问题。:(

在此之前,我曾尝试重新启动systemd,但这并没有解决问题。我仍然不知道发生了什么,可能我在内核和系统配置中碰到了一些错误。

内核:5.4.0-47-generic #51-Ubuntu

系统d:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1034059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档