一些特殊情况下需要在 Docker 中使用 systemctl。
对CentOS系统镜像
对于部分系统镜像如 centos7、centos8 而言,可以在创建时使用 /init/sbin ,或者再加上 –privileged=true。
整体如下
docker run --name mycontainer --privileged=true -dit centos:8 /sbin/init
即可解决。
对Debian系统镜像
对于 Debian 系统镜像,如 CentOS 那样创建会报错:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "/sbin/init": stat /sbin/init: no such file or directory: unknown.
这是由于镜像中移除了 init。
可以使用 Dockerfile 创建一个包含 init 的 debian 镜像
新建一个文件夹,创建 Dockerfile:
vi Dockerfile
粘入以下内容
FROM debian
RUN apt-get update && apt-get install -y init && apt-get clean all
Esc,输:wq保存退出,再生成新镜像 debian_init
docker build -f ./Dockerfile . -t debian_init
这时即可基于包含 init 的镜像去创建可使用 systemctl 的 Debian 容器
docker run --name mycontainer --privileged=true -dit debian_init /sbin/init
不过这样使用下,容器一旦 restart ,systemctl 相关的命令还是会出问题,会提示
Failed to connect to bus: No such file or directory
需要 commit 为镜像,再重新基于镜像用如下类似方式创建,才能避免这个问题。
docker run --name mycontainer --privileged=true -dit myimage /sbin/init
略显麻烦,所以能不在容器中使用 systemctl 还是尽可能不用。
ubuntu20.4 commit为镜像了,再基于镜像重新创建还是Failed to connect to bus:
请问有什么解决方案吗
暂没用过 ubuntu20.4,基于镜像重新创建的时候有带上 /sbin/init 吗?