Docker 系统尚未使用 systemd 作为 init 系统启动

问题描述 投票:0回答:9

我的 docker 容器上运行着一个 Ubuntu 18.04 映像。我登录并安装了

Openresty
。还安装了
systemd
。当我使用命令
systemctl
时,我收到此错误:

System has not been booted with systemd as init system (PID 1). Can't operate.

我该如何修复它?

docker ubuntu systemd
9个回答
35
投票

如果我理解OP,他正在尝试在容器中运行systemctl。这不起作用,因为 systemd 一开始就没有在容器内运行。它不能在非特权容器中完成。 SO 中还有一个问题是关于 为什么他不应该在容器中运行 systemd

我很快用谷歌搜索,找到了这个 2014 年关于

在 docker 容器内使用 systemd 的页面,其中有一个简短的解释。解决方法是使用特权容器(运行docker run --privileged ...

),这可以说是一个坏主意,但可能适合OP。 2019 年
更新了上一篇文章,底线是他们开发了自己的容器引擎(所以没有 docker)。

显而易见的解决方案是拥有单一服务,因此不需要 systemd,尽管这在 OP 的情况下可能是不可能的。

总而言之,可能的解决方案:

    不使用systemd
  • 使用特权容器
  • 不使用docker

21
投票
您需要通过此命令启动容器才能启用 systemd。

docker run -itd --privileged docker pull ubuntu:18.04 /usr/sbin/init
    

20
投票
在您的终端中,您可以输入:

$ sudo dockerd

奇迹发生了

所以,打开其他终端并尝试一下

$ docker ps -a

如果您仍然遇到权限问题,请运行:

$ sudo usermod -aG docker your-user
    

19
投票
您是否尝试使用:

sudo /etc/init.d/docker start

代替
systemd

我也有类似的问题,已经解决了。


5
投票
为了补充@javier-gonzalez的答案,如果您遵循

在容器内运行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"]
    

0
投票
在自己尝试了 Systemd 并遇到这个问题之后,我找到了一个很好的解决方案来在 Docker 中解决这个问题。

您可以设置一个 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


0
投票
如果以上都不能解决问题,可能是您在虚拟机上使用了 wsl,您需要重新检查您是否启用了

Hardwere Virtualization:

    使用客户端或 Web 客户端连接到 VM 管理器主机。
  1. 关闭或关闭要启用虚拟化的虚拟机。
  2. 右键单击虚拟机,然后选择“编辑设置”或“虚拟机设置”。
  3. 在虚拟机设置窗口中,导航至“VM 选项”或“CPU”部分。
  4. 查找与虚拟化相关的选项,例如“硬件虚拟化”或“向来宾操作系统公开硬件辅助虚拟化”。
  5. 如果尚未启用虚拟化选项,请启用它。
  6. 保存虚拟机设置。
  7. 打开虚拟机电源。

-2
投票
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
    

-7
投票
你可能在使用前忘记启动docker了

sudo service docker start
    
© www.soinside.com 2019 - 2024. All rights reserved.