안녕하세요. 저는 Docker 컨테이너에서 cron 작업을 실행하려고 합니다. 그래서 나는 내 안에 있어요Dockerfile
내 거Dockerfile
FROM nginx:stable
RUN apt-get update -y && apt-get upgrade -y && apt-get install -y \
vim \
git \
curl \
wget \
certbot \
cron
COPY cron/crontab /etc/crontab
RUN chmod 0644 /etc/cron.d/crontab
RUN /etc/init.d/cron start
내 crontab
프로필
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
*/1 * * * * root echo "test" >>~/readme
그러나 이것은 작동하지 않습니다.
작동하려면 /etc/init.d/cron start
nginx 컨테이너에서 명령을 수동으로 실행해야 합니다.
Dockerfile
그래서 컨테이너가 시작될 때 이 명령이 실행될 수 있도록 my에 진입점을 추가했습니다 .
# ENTRYPOINT
ADD entrypoint.sh /entrypoint.sh
RUN chmod 777 /entrypoint.sh
내 거entrypoint.sh
#!/usr/bin/env bash
/etc/init.d/cron start
내 거docker-compose
entrypoint: /entrypoint.sh
하지만 다음과 같은 오류가 발생했습니다.
OCI 런타임 실행 실패: 실행 실패: 컨테이너_linux.go:296: 컨테이너 프로세스를 시작하면 "process_linux.go:86: setns 프로세스를 실행하면 "종료 상태 21"이 발생합니다.": 알 수 없음
내가 놓친 게 무엇입니까?
PS: 나는 이것을 따랐다지도 시간
답변1
저는 며칠 전에 비슷한 문제로 어려움을 겪고 있었는데, 제가 처음 배운 내용을 바탕으로 한 몇 가지 참고 사항은 다음과 같습니다.
서비스와 같은 컨테이너를 실행하려면 어딘가(cmd 또는 진입점)에 실행 중인 포그라운드 프로그램이 있어야 합니다. 귀하의 경우에는 (nginx 이미지에서)입니다
nginx -g daemon off;
.또한 진입점과 cmd가 있는 경우 진입점에 대한 인수로 cmd가 전달되어 시작됩니다( 와 마찬가지로
./entrypoint.sh [cmd]
).RUN /etc/init.d/cron start
이미지가 빌드된 후에는 어쨌든 종료되므로 의미가 없습니다 .
해결책: 사용 중입니다.진입점.sh다음과 같은 것(내 경우에는 django/gunicorn/cron):
#!/bin/bash
set -e # exit on any error
if [ "$1" = './gunicorn.sh' ]; then # './gunicorn.sh' is default command
cron # this runs cron as daemon
crontab -u django /app/crontab # this applies a crontab from a file
exec su django -c "$@" # this actually runs the default command as different user (you can just use exec "$@" if you dont need to run it as different user)
fi
exec "$@" # this runs any other cmd without starting cron (e.g. docker run -ti myimage /bin/bash)
답변2
Docker 이미지의 기초로 무엇을 사용하고 있습니까(즉, FROM
라인에 무엇이 있습니까)?
많은 docker 기본 이미지는 기존 배포판(예: alpine, debian, ubuntu, centos 등)의 최소 설치로 시작한 다음 필요한 패키지를 추가합니다.
기본 이미지가 기본적으로 포함되지 않은 경우 배포판의 적절한 패키징 도구(예:cron
, 또는 실행 가능한 스크립트를 에 넣어)를 사용하여 Dockerfile에 설치합니다 .apt-get install cron
/etc/crontab
/etc/cron.d
어떤 경우에는 cron
설치되었지만 비활성화되었을 수 있습니다. 컨테이너를 시작하려면 컨테이너의 시작 스크립트를 수정해야 합니다 crond
. 이는 Dockerfile(각 컨테이너가 시작될 때가 아닌 컨테이너 빌드 프로세스 중에 명령을 실행하는 데 사용됨)에서 RUN 명령을 사용하는 것과 다릅니다. 이를 수행하는 방법은 사용 중인 기본 이미지에 따라 다릅니다.