Docker에서 프로세스 오류를 관리하려면 'systemctl'을 사용하십시오.

전임자의 Django 프로젝트를 인수하는이 프로젝트는 배포 중 프로세스 관리를 위해 감독자를 사용합니다. 향후 배포를 용이하게하기 위해 프로젝트를 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 디렉토리에 있습니다.
이 이미지는 먼저 supervisor 및 systemd를 설치하고,
두 번째는 컨테이너에 프로젝트 디렉터리를 만들고 디렉터리 아래에 로그 디렉터리를 만듭니다.
다시 호스트의 코드를 컨테이너의 프로젝트 디렉터리에 복사하고 호스트의 감독자 구성 파일을 다음 위치에 복사합니다. 구성 디렉토리에서 컨테이너의 관리자는,
다음 프로젝트 종속성을 설치하고 국내 핍 소스 미러를 구성,
다음 프로젝트 /, 즉, 후속 명령이 디렉토리에 실행으로 컨테이너에서 작업 디렉토리를 지정,
마지막으로, 복사 된 구성 파일을로드하려면 감독자를 다시 시작하십시오.
미러 생성 :

$ 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