code-serverが応答しなくなる

Podmanのコンテナとして動かしているcode-serverが「何かの拍子」に応答しなくなるので困っていたんだが、code-serverをDockerコンテナとして動かしている人たちのブログを見る限り、そういった問題は起きて無さそうなので、たぶんPodmanのせい。

そしてnode.jsのログにも何も出力されないし、応答しない状態になっていても下記コマンドを実行すると、

$ curl -s http://$(podman inspect code-server | jq -r '.[].NetworkSettings.IPAddress'):8080

Found. Redirecting to ./login

と言っているのでコンテナ自体は動作している。クライアントであるmacOSその他からアクセスしようとすると応答しない、という状態。

これはきっと下記ネットワークの2つめの矢印のところ、つまりbridgeが転送してくれてないんだろと当たりをつけたものの、起動時には動いているものが「何かの拍子」に動かなくなるのが分からない。

macOS -> 192.168.1.2:8080 -> 10.88.0.2:8080

んで、動かなくなるタイミングに何か起きてないか、macOSからcurlを叩き続けてログをとりサーバ側のログと付き合わせてみたら、分かった。

スパムが届くとsystemd.pathで自動的にメールのヘッダからIPアドレスを抜き出してfirewalldのルールを追加し、ルールをreloadしているんだがこれとタイミングが合ってる。podmanのnetwork設定がflushされてしまうらしい。なるほど。

これに対処するには、下記のように2つのコマンドをセットで

$ firewall-cmd --reload
$ podman network reload -a

することが、[必須]ということだ。これ、絶対忘れるでしょ。firewalldのプラグインとかモジュールで実装してくれよ。firewalldのルールがリロードされる時に、もしpodmanのnetwork設定があるなら、それもリロードするようにしてくれ…。

詳細というほどでもないけれど、man podman-network-reloadに説明がある。

DESCRIPTION
       Reload one or more container network configurations.

       Rootfull Podman relies on iptables rules in order to provide network
       connectivity. If the iptables rules are deleted, this happens for
       example with firewall-cmd --reload, the container loses network
       connectivity. This command restores the network connectivity.

追記:この問題に対するRFEがあることを教えていただいた。