도커 컨테이너의 crontab

도커 컨테이너의 crontab

안녕하세요. 저는 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 startnginx 컨테이너에서 명령을 수동으로 실행해야 합니다.

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 명령을 사용하는 것과 다릅니다. 이를 수행하는 방법은 사용 중인 기본 이미지에 따라 다릅니다.

관련 정보