我正在构建一个最小的 Debian 映像,其中包含 debootstrap、chroot 并安装 grub。
现在我需要安装一些自定义的自行创建的 debian 软件包。这些软件包具有运行数据库迁移的 postinst 脚本。但是在我的 chroot 环境中,postgresql 当然没有运行。
我尝试过systemd-nspawn
,但如果没有该-b
标志,容器不会启动,并且 postgresql 也不会运行。
当然,在第一次真正启动期间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