如何在 Docker 使用 systemctl

异常

现象为在命令行执行 systemctl 命令,报如下错误:

1
2
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

解决方法

参考了之后给出如下解决方案:

  1. 安装 daemonize 和 fontconfig
1
sudo apt install -y fontconfig daemonize
  1. 编辑 /etc/profile 脚本,加入如下内容:
1
2
3
4
5
6
7
8
9
10
SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')

if [ -z "$SYSTEMD_PID" ]; then
sudo /usr/bin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
fi

if [ -n "$SYSTEMD_PID" ] && [ "$SYSTEMD_PID" != "1" ]; then
exec sudo /usr/bin/nsenter -t $SYSTEMD_PID -a su - $LOGNAME
fi
  1. 修改 /etc/sudoers 文件,加入如下内容:
1
2
%sudo ALL=(ALL) NOPASSWD: /usr/sbin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
%sudo ALL=(ALL) NOPASSWD: /usr/bin/nsenter -t [0-9]* -a su - [a-zA-Z0-9]*
  1. 执行 source /etc/profile 或者是重新打开 terminal,执行 systemctl 验证是否能够正常操作。

附件

相关连接