我的 docker 容器上运行着一个 Ubuntu 18.04 映像。我登录并安装了
Openresty
。还安装了systemd
。当我使用命令 systemctl
时,我收到此错误:
System has not been booted with systemd as init system (PID 1). Can't operate.
我该如何修复它?
如果我理解OP,他正在尝试在容器中运行systemctl。这不起作用,因为 systemd 一开始就没有在容器内运行。它不能在非特权容器中完成。 SO 中还有一个问题是关于 为什么他不应该在容器中运行 systemd 。
我很快用谷歌搜索,找到了这个 2014 年关于在 docker 容器内使用 systemd 的页面,其中有一个简短的解释。解决方法是使用特权容器(运行docker run --privileged ...
),这可以说是一个坏主意,但可能适合OP。 2019 年更新了上一篇文章,底线是他们开发了自己的容器引擎(所以没有 docker)。 显而易见的解决方案是拥有单一服务,因此不需要 systemd,尽管这在 OP 的情况下可能是不可能的。
总而言之,可能的解决方案:
docker run -itd --privileged docker pull ubuntu:18.04 /usr/sbin/init
$ sudo dockerd
奇迹发生了
所以,打开其他终端并尝试一下
$ docker ps -a
如果您仍然遇到权限问题,请运行:
$ sudo usermod -aG docker your-user
sudo /etc/init.d/docker start
代替
systemd
?我也有类似的问题,已经解决了。
在容器内运行systemd并在尝试运行容器时收到错误bash: /usr/sbin/init: No such file or directory
,则可以使用
/lib/systemd/systemd
作为Dockerfile中的ENTRYPOINT,因为
/usr/sbin/init
因为它只是同一事物的符号链接。
FROM ubuntu:<anyversion>
ENTRYPOINT ["/lib/systemd/systemd"]
您可以设置一个 cronjob 在容器重新启动时运行。
Dockerfile.yml
:
COPY startup.sh /home/$USERNAME
WORKDIR /home/$USERNAME
RUN chmod +x startup.sh
RUN runuser -u $USERNAME -- echo "@reboot /home/$USERNAME/startup.sh" >> cronjobs
RUN runuser -u $USERNAME -- crontab cronjobs
RUN runuser -u $USERNAME -- rm cronjobs
https://askubuntu.com/questions/814/how-to-run-scripts-on-start-up#816
Hardwere Virtualization:
sudo apt-get update && sudo apt-get install -yqq daemonize dbus-user-session fontconfig
sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
exec sudo nsenter -t $(pidof systemd) -a su - $LOGNAME
sudo service docker start