在 chroot 中安装 Debian 软件包

在 chroot 中安装 Debian 软件包

我正在构建一个最小的 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

相关内容