Use Systemd in Docker Container

2021/08/03

Use systemd in docker container

公司的代码比较老旧加上使用的gcc版本也比较低,我放弃了在macOS上直接开发,之前在自己搭建的CentOS7虚拟机下面搭建了一个开发环境,其实环境还是很OK的,但是虚拟机有个缺点就是没有那么方便迁移,且比较笨重,于是我想着能不能将开发环境容器化,于是遇到systemd在docker下面的问题,便记录下来。

Solution

通过不断的Google,我终于成功的在CentOS7的container下面用起了systemd和ccls, 首先我们需要一个下面的Dockerfile

FROM centos:7
ENV container docker
RUN yum -y install systemd; yum clean all;
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in ; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done);
RUN rm -rf /lib/systemd/system/multi-user.target.wants/;
RUN rm -rf /etc/systemd/system/.wants/;
RUN rm -rf /lib/systemd/system/local-fs.target.wants/;
RUN rm -rf /lib/systemd/system/sockets.target.wants/udev;
RUN rm -rf /lib/systemd/system/sockets.target.wants/initctl;
RUN rm -rf /lib/systemd/system/basic.target.wants/;
RUN rm -rf /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ] 
RUN yum -y install gcc
RUN yum -y install epel-release
RUN yum -y install snapd
CMD ["/usr/sbin/init"]

在Docker目录的同级目录下面执行docker build -t dev .
我们在执行完之后去执行docker run -itd –name container01 –privileged=true dev /sbin/init 启动容器
使用docker exec -ti container01 bash进入容器的交互shell,执行systemctl status snapd如果没有报错那么恭喜你,成功地在容器下面使用了systemd,安装ccls可以参考下图中地命令 “systemd and ccls”


Comments🎉