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があることを教えていただいた。