nginx
나는 도커를 사용하고 있습니다. cron
SSL 인증서 및 DNS 등록을 업데이트하도록 작업을 구성했습니다 . 그러나 cron
작업이 실행되고 있지 않습니다.
내가 뭘 한거지. 이 인턴을 Dockerfile
기반으로 베이스를 만들었습니다 . 처음에는 실행될 것이라고 가정하고 설치했지만 서비스가 시작되지 않은 것을 발견했습니다(init 하위 시스템이 설치되지 않았고 debian:stretch-slim이 매우 작았습니다). 그래서 start 에 코드를 추가했습니다 . 이제 컨테이너가 실행 중인지 묻는다면 '예'라고 대답합니다.arm32v7/nginx
debian:stretch-slim
cron
cron
cron
#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 작업이 실행되지 않습니다. - 구성 파일의 하드 링크 수를
cron
1로 줄입니다. dotouch /etc/crontab /etc/cron.*/*
- (docker에 있는 경우) 시작 스크립트에 넣었습니다. - 시작
cron
:service cron start
— (기본 OS의 경우 초기화가 없습니다. docker에서 사용되는 많은 기본 이미지와 같습니다). 시작 스크립트에 넣었습니다.
이 답변의 진입점 스크립트와 질문의 다른 모든 항목이 이를 수행합니다. 현재 프로젝트는 다음과 같은 방법으로 얻을 수 있습니다hg clone ssh://[email protected]/davids_dad/a_website