Podman의 소켓 활성화 메커니즘에 버그가 발생했지만 문제가 Podman인지 systemd인지 확실하지 않습니다.
/run/docker.socket
docker 도구가 기본적으로 예상하는 정규화된 경로를 노출하기 위해 podman 서비스에 대한 대체 관리형 소켓 장치를 만들었습니다 .
# 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이 활성화되었을 때 청취자를 보면 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)
지금 이 행동이 정상인가요? 이것은 들어오는 연결을 계속 수신하면서 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
?
답변1
이제 동일한 서비스에 대해 여러 소켓을 활성화하는 데 문제가 있는지 확실하지 않습니다. 지금까지는 그렇지 않은 것 같지만 기본 podman.socket 장치가 올바르게 비활성화되었다고 가정합니다.
주문하다
podman system service
다중 청취 소켓은 현재 지원되지 않습니다.
관련 소스 코드(2023년 7월 2일 기준 GitHub 마스터 브랜치에 대한 영구 링크 포함):
참조: podman GitHub 문제#17754("오류: 소켓 활성화 프로토콜에 대한 파일 설명자 수가 잘못되었습니다(2 != 1).")
답변2
~에 따르면systemd
문서, 서비스 단위 종속성을 재정의할 수 없습니다.
종속성(이후= 등)은 빈 목록으로 재설정할 수 없으므로 종속성은 드롭인에서만 추가할 수 있습니다. 종속성을 제거하려면 전체 단위를 덮어써야 합니다.
podman-docker
이 패키지를 설치하는 것이 더 쉽다고 생각합니다 .
docker
유사한 명령으로의 원활한 리디렉션을 위한 스크립트를 설정하고 Podman 소켓을 가리키도록 podman
심볼릭 링크도 설정합니다 . /run/docker.sock
마지막으로 이 작업을 수행해야 했을 때는 systemd를 변경할 필요가 없었습니다. 단지 시스템이 podman.socket
활성화되어 실행 중인지 확인하기만 하면 됩니다.