Docker中使用systemctl的方法

一些特殊情况下需要在 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 还是尽可能不用。

资料

https://notesail.com/posts/docker-systemctl.html

https://docs.docker.com/engine/reference/builder/

《Docker中使用systemctl的方法》有2条评论

发表评论