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チームにバグレポートを送信する必要がありますか?
ありがとうございます。
編集:実際には2つのソケットデバイスのために奇妙な循環依存関係があるようです。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
で実行中であることを確認するだけです。