
私はdebootstrap、chroot、およびgrubのインストールを含む最小のDebianイメージを作成しています。
今すぐ作成したカスタムDebianパッケージをインストールする必要があります。これらのパッケージには、データベースの移行を実行するpostinstスクリプトがあります。しかし、もちろん私のchroot環境ではpostgresqlが実行されていません。
試してみましたが、対応systemd-nspawn
するフラグがない場合、-b
コンテナは起動せず、postgresqlは実行されません。
もちろん、最初の実際の起動中にpostinstがapt install ...
失敗して実行されると、apt install
postinstは正常に再実行される可能性がありますが、これは厄介です。
最小限のクリーンブータブル構成イメージを準備するためのより良い方法はありますか?
答え1
カスタムパッケージをインストールする前にchrootでPostgreSQLを起動しないのはなぜですか?
デフォルトでは、systemdサービスはchrootでは実行されませんが、PostgreSQLを手動で起動できます。たとえば、次のようになります。
su postgres -c 'pg_ctl start -D /usr/local/pgsql/data -l serverlog'
(次から取得したコマンドPostgreSQL 11ドキュメント)
起動に失敗した場合は、サーバーのログファイルを確認して理由を確認してください。
答え2
実行イメージを使用して起動するのを待ってから、systemd-nspawn --boot
実行コマンドを使用してください。systemd-run
#!/bin/bash
MACHINE_NAME=target$$
wait_for_container() {
while true; do
if machinectl | grep --quiet "$MACHINE_NAME"; then
break
fi
echo "Wait for container $MACHINE_NAME"
sleep 1
done
echo "Container up!"
}
poweroff_container() {
machinectl poweroff $MACHINE_NAME
}
systemd-nspawn --boot --machine $MACHINE_NAME --directory "$MOUNT_PATH" > /dev/null 2>&1 &
# wait until container is up
wait_for_container
systemd-run --machine $MACHINE_NAME --pipe --wait /bin/bash <<EOF
# do your stuff
hostnamectl set-hostname your-hostname
EOF
poweroff_container