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

创建成功。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值