ubuntuのpodman-composeがクセ強いので、注意
環境について
こちらの環境で確認しております
PRETTY_NAME="Ubuntu 24.04 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo
インストール方法
apt-get install -y podman podman-compose
とりあえず使ってみる
podman compose up -d
デバッグ情報が流れ込んでくるが、とりあえず動く
ユーザー空間で使ってみる
sudoでユーザーを移動するならDBUS_SESSION_BUS_ADDRESS
環境変数をいい感じにセットしてあげる必要がある。
export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u)/bus"
bashrcに登録するといいかもね
export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u)/bus" >> ~/.bashrc
あと、ログイン設定を変更してあげないといけない。
systemd環境における通常のログインプロセスは、ユーザーがログインと同時にユーザー空間用systemdが動作する。
これにより、systemctl --user
関連のコマンド、つまりはユーザー専用サービスが起動する。
しかし、sudoなどはログインプロセスを実施してくれない。
そこで、systemdにユーザーが常時ログインしている状態を維持するよう指示しないといけない
それがlinger
と呼ばれるもの
まず、rootか通常sudoでこれを実行
sudo loginctl enable-linger <ユーザー名>
これで常時起動させられる。 また、ユーザー空間のサーバーが常時起動するようになるため、
ユーザー空間で動作させたいサーバーなどには最適解だったりする
composeを自動起動させる
ユーザー空間のcomposeやpodmanのpodは自動起動をしない。
なので、systemdなどで起こしてやる必要がある。 この際にもlingerが役に立つ。
まず、rootかsudoで
sudo podman compose systemd -a create-unit
ubuntu版の場合、どういうわけかコンテナ起動時にpodman startをするが、
コンテナの名前解決がふつーにできないのでユニットファイルを改造する。
sudoedit /etc/systemd/user/podman-compose\@.service
# /etc/systemd/user/podman-compose@.service
[Unit]
Description=%i rootless pod (podman-compose)
[Service]
Type=simple
EnvironmentFile=%h/.config/containers/compose/projects/%i.env
ExecStart=/usr/bin/podman-compose -f ${COMPOSE_PROJECT_DIR}/${COMPOSE_FILE} up
ExecStop=/usr/bin/podman-compose -f ${COMPOSE_PROJECT_DIR}/${COMPOSE_FILE} down
[Install]
WantedBy=default.target
これができてたら
podman compose systemd
systemctl --user enable podman-compose@
(@の先にcompose名)
で動くはず
なぜStop時にdownさせるの?
まずdownの挙動が、コンテナを停止させ、削除するというものなんだけど
コンテナを削除するという理由が、コンテナ内に不要物(ログとか)がたまっていく恐れがあるというもの、
あとは、コンテナが永久的に存在する保証がないというところから、思い切って消去してます
なので、コンテナ設計時もそれを意識するのがいいと思います。
(イメージをビルドしたら半永久的に使えるようになります)
個人的な疑問
-
machinectl
使えって公式が言ってるが、環境変数などで解決できるから問題ないんじゃないか?
どういうわけかコンテナ起動時にpodman startをするが、
- などといったが、実際元コードがどうしてそうなったのか理解してない(...いやな予感がする