저는 debootstrap, chroot 및 grub 설치를 포함하는 최소 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