chroot に Debian パッケージをインストールする

chroot に Debian パッケージをインストールする

私はdebootstrap、chroot、およびgrubのインストールを含む最小のDebianイメージを作成しています。

今すぐ作成したカスタムDebianパッケージをインストールする必要があります。これらのパッケージには、データベースの移行を実行するpostinstスクリプトがあります。しかし、もちろん私のchroot環境ではpostgresqlが実行されていません。

試してみましたが、対応systemd-nspawnするフラグがない場合、-bコンテナは起動せず、postgresqlは実行されません。

もちろん、最初の実際の起動中にpostinstがapt install ...失敗して実行されると、apt installpostinstは正常に再実行される可能性がありますが、これは厄介です。

最小限のクリーンブータブル構成イメージを準備するためのより良い方法はありますか?

答え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

関連情報