docker中使用'systemctl'管理进程报错

接手前辈的一个Django项目,这个项目在部署时使用supervisor作进程管理。为了方便以后的再次部署,我尝试将项目封装为一个Docker镜像。
Dockerfile内容如下:

FROM python:3.7

ENV PYTHONUNBUFFERED 1

RUN apt-get update \
    && apt-get -y install supervisor \
    && apt-get -y install systemd\
    && mkdir -p /home/project \
    && cd /home/project \
    && mkdir static \
    && mkdir media \
    && mkdir logs

COPY ./myproject/* /home/project/
COPY ./project.conf /etc/supervisor/conf.d
RUN pip install -r /home/project/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

WORKDIR /home/project

RUN systemctl restart supervisor.service

项目代码在主机的myproject目录中。
这个镜像首先安装supervisaor和systemd;
其次在容器中创建project目录并在目录下创建日志目录;
再次将主机中的代码复制到容器中的project目录下并将主机中的supervisor配置文件复制到容器的supervisor配置目录中;
随后安装项目依赖,并配置国内的pip源镜像;
之后指定容器内工作目录为project/,即之后的命令都在这个目录下执行;
最后重启supervisor以加载拷入的配置文件。
生成镜像:

$ docker build -t apollo_docker .

但是生成镜像的最后一步报错了:

Step 8/8 : RUN systemctl restart supervisor.service
 ---> Running in 78350c856c39
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
The command '/bin/sh -c systemctl restart supervisor.service' returned a non-zero code: 1

原因是RUN调用的是bash/,而supervisor需要init/调用,所以可以把作后一行命令改为

CMD ["/usr/sbin/init" "systemctl" "restart supervisor.service"]

再次创建:

$ docker build -t apollo_docker .
Sending build context to Docker daemon  36.47MB
...
...
Successfully tagged apollo_docker:latest

创建成功。

猜你喜欢

转载自blog.csdn.net/JosephThatwho/article/details/102943306