我在Docker容器中运行了一个Ubuntu 18.04的镜像。我登录进去并安装了Openresty
和systemd
。当我使用命令systemctl
时,出现了以下错误:
System has not been booted with systemd as init system (PID 1). Can't operate.
我该如何解决这个问题?
docker run --privileged ...
),这可能是一个糟糕的主意,但可能适合OP。这是2019年最后一篇文章的更新, 结论是他们开发了自己的容器引擎(所以没有docker)。docker run --privileged ...
没有帮助我 :( - tolache在你的终端中,你可以键入:
$ sudo dockerd
奇迹就在此刻发生
因此,请打开另一个终端并尝试它
$ docker ps -a
如果仍然存在权限问题,请运行以下命令:$ sudo usermod -aG docker your-user
dockerd
。至少守护进程已经启动,我可以看到错误消息显示正在发生的事情!但仍然出现 docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: can't get final child's PID from pipe: EOF: unknown.
的问题。 - GlenPetersongrpc: addrConn.createTransport 连接失败 {unix:///var/run/docker/containerd/containerd.sock <nil> 0 <nil>}。错误信息:connection error: desc = "transport: Error while dialing dial unix:///var/run/docker/containerd/containerd.sock: timeout"。正在重新连接... module=grpc 无法启动守护程序:未挂载设备 cgroup。
- smartmouse你尝试使用:sudo /etc/init.d/docker start
,而不是 systemd
吗?
我有一个类似的问题,这解决了它。
您需要使用此命令启动容器以启用systemd。
docker run -itd --privileged docker pull ubuntu:18.04 /usr/sbin/init
/usr/sbin/init
,他的回答不够。这个答案可以解决问题。 - janbash:/usr/sbin/init:没有那个文件或目录
,则可以在Dockerfile中使用/lib/systemd/systemd
作为ENTRYPOINT,而不是/usr/sbin/init
,因为它只是指向相同内容的符号链接。FROM ubuntu:<anyversion>
ENTRYPOINT ["/lib/systemd/systemd"]
在我自己玩弄Systemd并遇到这个问题后,我发现在Docker中有一个好的解决方法来解决这个问题。
您可以设置一个定时任务,在容器重新启动时运行。
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
如果以上方法都不能解决问题,那么可能是您在虚拟机上使用了wsl,那么您需要重新检查是否启用了 硬件虚拟化:
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
在使用 Docker 之前,您可能忘记启动它了。
sudo service docker start
systemctl
这样的命令在 Docker 内部根本无法工作。 您可以将 Docker 视为打包“应用程序”的方式,而不是具有 init 系统、用户和进程的完整 VM;Docker 的 Containerizing an application 教程介绍了一个基本的标准用例。 - David Maze