我遇到了 podman 套接字激活机制的错误,但我不确定问题是出在 podman 还是 systemd 上。
我为 podman 服务创建了一个替代的托管套接字单元,以便公开 docker 工具默认期望的标准
/run/docker.socket
路径:
# systemctl cat docker.socket
# /etc/systemd/system/docker.socket
[Unit]
Description=Docker API Socket
Documentation=man:podman-system-service(1)
[Socket]
ListenStream=%t/docker.sock
SocketMode=0660
Service=podman.service
[Install]
WantedBy=sockets.target
[Socket]
SocketGroup=wheel
基本上与默认
podman.socket
单位相同。
现在我不确定让多个套接字激活同一个服务是否有问题,直到现在似乎没有问题,但假设默认
podman.socket
单元被正确禁用。
现在,如果我尝试连接到套接字(例如
nc -D -U /run/docker.sock
),从而激活 podman 服务,podman 就会陷入失败循环:
Mar 10 14:38:17 drpyser-workstation podman[266938]: time="2023-03-10T14:38:17-05:00" level=info msg="/usr/bin/podman filtering at log level info"
Mar 10 14:38:17 drpyser-workstation podman[266938]: time="2023-03-10T14:38:17-05:00" level=info msg="Setting parallel job count to 49"
Mar 10 14:38:17 drpyser-workstation podman[266938]: time="2023-03-10T14:38:17-05:00" level=info msg="Using systemd socket activation to determine API endpoint"
Mar 10 14:38:17 drpyser-workstation podman[266938]: Error: wrong number of file descriptors for socket activation protocol (2 != 1)
Mar 10 14:38:17 drpyser-workstation systemd[1]: podman.service: Main process exited, code=exited, status=125/n/a
Mar 10 14:38:17 drpyser-workstation systemd[1]: podman.service: Failed with result 'exit-code'
(这样重复一段时间直到累了)
我相信当我激活它时,我可以通过观察
/run/docker.sock
上的听众来观察 podman 抱怨的情况。
在我激活插座之前,lsof /run/docker.sock
显示
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE
NAME
systemd 1 root 47u unix 0x00000000bad2c1a8 0t0 776246
/run/docker.sock type=STREAM (LISTEN)
到目前为止一切顺利,systemd 正在完成其监听套接字的工作,等待传入连接传递给 podman。
当我激活插座时:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE
NAME
systemd 1 root 47u unix 0x00000000bad2c1a8 0t0 776246
/run/docker.sock type=STREAM (LISTEN)
systemd 1 root 49u unix 0x00000000dec938bb 0t0 802883
/run/docker.sock type=STREAM (LISTEN)
现在这种行为正常吗?这个 systemd 是否在套接字上生成一个新的文件描述符以传递给 podman,同时仍在监听传入的连接,在这种情况下 podman 没有业务抱怨,我应该向 podman 团队提交错误报告?
谢谢。
编辑:实际上,由于我的两个套接字单元,似乎存在一些奇怪的循环依赖。
docker.socket
如果我掩饰就不会工作podman.socket
:
Mar 10 16:03:49 drpyser-workstation systemd[1]: docker.socket: Failed to queue service startup job (Maybe the service file is missing or not a non-template unit?): Unit podman.socket is masked.
Mar 10 16:03:49 drpyser-workstation systemd[1]: docker.socket: Failed with result 'resources'.
我没能找到一种方法来减少
podman.service
和 podman.socket
之间的依赖关系:
podman.service
× ├─docker.socket
○ ├─podman.socket
● ├─system.slice
● └─sysinit.target
● [...]
尽管玩弄覆盖:
# /usr/lib/systemd/system/podman.service
[Unit]
Description=Podman API Service
Requires=podman.socket
After=podman.socket
Documentation=man:podman-system-service(1)
StartLimitIntervalSec=0
[Service]
Delegate=true
Type=exec
KillMode=process
Environment=LOGGING="--log-level=info"
ExecStart=/usr/bin/podman $LOGGING system service
[Install]
WantedBy=default.target
# /etc/systemd/system/podman.service.d/override.conf
[Unit]
Requires=
After=
Requires=docker.socket
After=docker.socket
有没有办法让 systemd 明白我想删掉
podman.socket
?
我相信您发现了一个错误(或可能的功能请求,具体取决于您如何看待它)。
通常应该解析环境变量
LISTEN_FDS
。该字符串包含 systemd 让应用程序继承的文件描述符的数量。似乎 Podman 源代码只是检查字符串是否为非空,如果是,Podman 假定数字为 1。