接手前辈的一个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
创建成功。