【问题标题】:How do I run a Docker container that uses SystemD from the latest version of Ubuntu (18.10)?如何从最新版本的 Ubuntu (18.10) 运行使用 SystemD 的 Docker 容器?
【发布时间】:2025-12-06 00:20:06
【问题描述】:

我正在尝试执行使用 'ubuntu:latest' 构建的 Docker 映像,并且在运行容器时不断收到 SystemD 错误消息:

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

如果我尝试这个 solution 并使用 docker run -it -e container=docker your-image-name /sbin/init 生成容器,我会收到以下错误:

Failed to mount tmpfs at /run: Operation not permitted
Failed to mount tmpfs at /run/lock: Operation not permitted
[!!!!!!] Failed to mount API filesystems, freezing.
Freezing execution.

我应该尝试什么不同的方法?

【问题讨论】:

  • 您通常不想在容器内运行像 systemd(或其他任何东西)这样的进程管理器。你到底想做什么?
  • 我正在尝试启动 Nginx 和 SSHD 容器。如果所有 Linux 发行版都已经迁移到 SystemD,你如何避免使用它?似乎这是一个应该已经解决的问题?
  • 已经解决了。您不在容器中使用处理器管理器。你启动你想要的服务,就是这样。看看任何官方容器,比如 nginx、httpd、mysql 等。你不会在容器中运行 ssh;这就是docker exec 的用途。
  • 嗯,好的,谢谢。我需要 SSH,因为我使用 Ansible 向它发送配置文件。 :)
  • 听起来您像管理虚拟机一样管理容器。我强烈建议不要这样做。你应该用 ansible 做的最多的事情就是构建一个镜像并运行容器。

标签: docker ubuntu systemd


【解决方案1】:

您可以使用其他版本解决此问题,例如 16.04:

docker run -d \
  -h ubuntu \
  --name ubuntu \
  --privileged \
  docker.io/library/ubuntu:16.04 /sbin/init

运行后,您可以使用以下命令访问:

docker exec -it ubuntu /bin/bash

此版本使用systemd

【讨论】:

    【解决方案2】:

    为了在 docker 中运行 ubuntu 18 systemd,你可以使用这个:

    运行容器:

    docker run -d --name stack_overflow_53750952 --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro jrei/systemd-ubuntu:18.04
    

    进入容器:

    docker exec -it stack_overflow_53750952 bash
    

    然后如您所见: screenshot of systemd running inside the container

    【讨论】:

      【解决方案3】:

      升级到 Ubuntu Bionic 并尝试/sbin/init 方法

      【讨论】:

      • 我的问题是针对 Ubuntu,而不是 CentOS
      最近更新 更多