Dockerfile

Dockerfile

nginx나는 도커를 사용하고 있습니다. cronSSL 인증서 및 DNS 등록을 업데이트하도록 작업을 구성했습니다 . 그러나 cron작업이 실행되고 있지 않습니다.

내가 뭘 한거지. 이 인턴을 Dockerfile기반으로 베이스를 만들었습니다 . 처음에는 실행될 것이라고 가정하고 설치했지만 서비스가 시작되지 않은 것을 발견했습니다(init 하위 시스템이 설치되지 않았고 debian:stretch-slim이 매우 작았습니다). 그래서 start 에 코드를 추가했습니다 . 이제 컨테이너가 실행 중인지 묻는다면 '예'라고 대답합니다.arm32v7/nginxdebian:stretch-slimcroncroncron

#ctrl-alt-delor@raspberrypi:~/a_website/docker$
#↳ docker exec -it $(docker container ls | sed -nr -e 's/.*(website-stack.*)/\1/p') service cron status
[ ok ] cron is running.

그러나 내가 추가한 작업의 로그는 표시되지 않습니다 cron.

을 실행하면 run-parts --report /etc/cron.daily작업이 실행되고 로그 출력이 생성됩니다. 그래서 여전히 cron실행되지 않는 것처럼 보입니다 .

#ctrl-alt-delor@raspberrypi:~/a_website/docker$
#↳ docker exec -it $(docker container ls | sed -nr -e 's/.*(website-stack.*)/\1/p') cat /proc/12/cmdline; echo
/usr/sbin/cron

그렇다면 cron작업을 실행해 보는 것은 어떨까요?내가 놓친 게 무엇입니까?

Dockerfile

FROM arm32v7/nginx

##add backports
COPY stretch-backports-source.list /etc/apt/sources.list.d/

##install cron and curl — so we can register dns regularly
RUN     apt-get update &&\
        apt-get install -y cron curl &&\
        apt-get clean

##setup cron to register dns
COPY register-dns register-dns.auth register-dns-hostname /usr/local/bin/
COPY register-dns.cron /etc/cron.daily/1-register-dns
RUN chmod +x /usr/local/bin/register-dns /etc/cron.daily/1-register-dns

##add curtbot
RUN apt-get update && \
    apt-get -t stretch-backports install -y python-certbot-nginx && \
    apt-get clean


#add ssl port
EXPOSE 443 80

##custom entry point — needed by cron
COPY entrypoint /entrypoint
RUN chmod +x /entrypoint
ENTRYPOINT ["/entrypoint"]
CMD ["nginx", "-g", "daemon off;"] #:tricky: we seem to need to re-specify this

LABEL name="my-nginx" \
      description="nginx + cron + curl + certbot + dns-registering"

entrypoint

#!/bin/sh

## Do whatever you need with env vars here ...
service cron start

# Hand off to the CMD
exec "$@"

/etc/crontab

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

/etc/cron.daily/1-register-dns

#!/bin/sh
date >> /var/log/register-dns
/usr/local/bin/register-dns >>/var/log/register-dns

답변1

어떤 오류가 발생했는지 확인하기 위해 설치했는데 rsyslog다음과 같은 결과가 나왔습니다.

(*system*) NUMBER OF HARD LINKS > 1 (/etc/crontab). 일부 검색에서는 cron파일에 대한 하드 링크가 많으면 보안 정책이 작동하지 않는다고 말했습니다 . 불행하게도 Docker의 계층화된 파일 시스템으로 인해 파일에 많은 하드 링크가 포함됩니다.

이 문제를 해결하기 위해 touch /etc/crontab /etc/cron.*/*실행하기 전에 시작 스크립트에 를 추가했습니다 cron. 그러면 다른 파일 인스턴스와의 연결이 끊어집니다.

새로운 진입점은

#!/bin/sh

#fix link-count, as cron is being a pain, and docker is making hardlink count >0 (very high)
touch /etc/crontab /etc/cron.*/*

service cron start

# Hand off to the CMD
exec "$@"

테스트해봤는데 작동해요

일반화하다

cron일하러 가려면 이렇게 해야 합니다.

  • 설치 cron— 설치되지 않은 경우
  • 크론 작업 /etc/cron.daily/(또는 매주)을 추가합니다. 스크립트 이름에 문자, 숫자, 하이픈만 포함되어 있는지 확인하세요.요점이 없어. (묻지마) 봐봐cron.daily에서 cron 작업이 실행되지 않습니다.
  • 구성 파일의 하드 링크 수를 cron1로 줄입니다. do touch /etc/crontab /etc/cron.*/*- (docker에 있는 경우) 시작 스크립트에 넣었습니다.
  • 시작 cron: service cron start— (기본 OS의 경우 초기화가 없습니다. docker에서 사용되는 많은 기본 이미지와 같습니다). 시작 스크립트에 넣었습니다.

이 답변의 진입점 스크립트와 질문의 다른 모든 항목이 이를 수행합니다. 현재 프로젝트는 다음과 같은 방법으로 얻을 수 있습니다hg clone ssh://[email protected]/davids_dad/a_website

관련 정보