도커-루트에 대한 크론 탭 없음


10

내 Dockerfile이 올바르게 빌드 된 것처럼 보입니다 (그렇습니다). 컨테이너를 실행하면 아래와 같은 오류 메시지가 나타납니다. CMD서비스 디렉토리 가 있거나 없는 명령 ( )을 실행하려고했습니다 .

crontab.sh기본적으로 cron 일정을 텍스트 파일 ( cron.jobs)에 쓴 다음 텍스트 파일을 crontab으로 가져옵니다.

도커 파일 :

FROM node:0.10
MAINTAINER Tom

VOLUME /var/log/

RUN mkdir /pulse
ADD . /pulse
WORKDIR /pulse

RUN apt-get update && apt-get install -y cron

ADD *.sh /pulse/
RUN chmod 750 /pulse/crontab.sh && chmod 750 /pulse/

RUN chmod 644 /etc/crontab

CMD cron -f
CMD touch /var/log/cron.log && sh /pulse/crontab.sh && tail -f /var/log/cron.log
CMD cron /pulse/cron.jobs
CMD crontab -l

edited to add crontab.sh

crontab.sh (일부 크론 제거) :

#!/bin/bash

cat <<- 'EOF' > cron.jobs

0 * * * * node /pulse/scripts/awsPulseTest.js > /tmp/awsPulseTest.log 2>&1

EOF

crontab cron.jobs

오류:

no crontab for root

사이드 노트 :

  • 펄스는 서비스 이름입니다.
  • 서비스로 인해 노드 버전이 오래되었습니다.이 버전은 업그레이드됩니다.
  • 이 서비스는 본질적으로 노드의 크론 작업을위한 것입니다

serverfault.com/a/851500/395574 와 serverfault.com/a/851479/395574 의 조합 으로이 문제를 해결했습니다.
— TomFirth

답변:


11

파일의 명령이 아닌 dockerfile에 문제가 있습니다. 하나만 CMD실행됩니다 (마지막 것) -https://docs.docker.com/engine/reference/builder/#cmd 참조

Dockerfile에는 CMD 명령이 하나만있을 수 있습니다. 둘 이상의 CMD를 나열하면 마지막 CMD 만 적용됩니다.


아, 그리고 그 밖의 모든 것 위에 있습니다 :) OP : 이것은 내 설명을 무효화하지 않으며 본질적으로로 대체해야 CMD합니다 RUN.
— Sven

2
나는 이것을 문제라고 부른다고 생각합니다. 이것은 의도적으로 설계된 동작입니다. 컨테이너는 미니 OS가 아닙니다. 그것들은 어플리케이션 중심입니다.
— JimmyJames

동의했다. 필자의 의도는 OP의 문제가 cron의 세부 정보가 아닌 도커 구성에 있음을 분명히하는 것이 었습니다.
— Paul Haldane 17 년

이것은 도커 문제 가 아닙니다 . 의도적으로 설계된 것입니다.
— 앤드류 Savinykh

5

다른 답변에서 이미 설명했듯이 CMDDockerfile 당 하나만 실행되며 실행하려는 명령이 잘못되었습니다.

그러나 설정 IMO에는 더 시급한 문제가 있습니다. Docker 컨테이너는 일반적으로 이러한 방식으로 작동하도록 설계되지 않았습니다. 당신이 대신해야 할 것은 아마 같은 것을 사용하여 (일회성 프로세스로 호스트 (또는 조정자)에서 크론 서비스를 실행 docker run하거나 docker-compose run어떤 이유로 당신이에 대해 별도의 컨테이너를 시작하지 않으려면 내가, 또는 docker exec)을 사용할 수 있다고 생각합니다 .

이것은 용기를 어떻게 사용 해야하는지에 대한 나의 견해이므로 분명히 소금 한 덩어리로 가져 가야합니다.


2
나는 cron에 대해 잘 알고 있지만 이것을 합리적으로 만들려면 CMD가 크론을 실행해야한다고 생각합니다. 그렇지 않으면 crontab 명령이 완료된 후 컨테이너가 종료됩니다.
— JimmyJames 17 년

@JimmyJames 당신이 말하는 것은 정확하지만 위에서 설명한 것처럼 더 나은 해결책은 외부 cron에서 이러한 명령을 일회용으로 실행하는 것 docker run입니다. 더 많은 컨테이너 Y. :)
— Artur Ciesielski 13:23에

당신이 옳을 수 있습니다. 컨테이너의 명령으로 크론을 실행하는 것이 타당한 지 확실하지 않기 때문에 질문이 흥미 롭습니다. 그것은 가능하지만 컨테이너에 어색해 보입니다.
— JimmyJames

3

에 추가하면 /etc/crontab루트의 개인 crontab에 표시 crontab -e되지 않습니다. 여기에는 시스템 전체가 아닌으로 편집 한 사용자 별 crontab 만 포함되어 있기 때문 입니다 /etc.


자세한 내용은:

내 추측은 /pulse/crontab.sh(당신이 보여주지 않는 이유는 무엇입니까?) 시스템 전체 crontab 파일에 관련 crontab 줄을 추가한다는 것 /etc/crontab입니다. 나중에 명령을 실행 crontab -l하지만, 목록 때문에 이것은 단지 오류가 표시됩니다 root의 개인 의 crontab 만 (비어있는 것으로 일어나는)에서가 아니라 시스템 전체의 하나 /etc/crontab. 이것은 모두 정상이며 예상되는 것입니다. 스크립트가 추가 선을 표시하려면 대체 할 CMD crontab -l함께 CMD cat /etc/crontab.

이 모든 것은 어떤 dockerfile 명령이 좋아하는과에 아무 상관이없는 ADD, RUN또는 CMD그냥 기본적인 리눅스 물건입니다.


나는 이것을 이해한다고 생각한다. 빌드 설정이 사용자이지만 루트 설정에서 루트 설정을 실행하려고합니까? 그 말이 맞습니다, 그 문제를 해결하려고 노력할 것입니다. 나는 당신이 의미하지 않았다고 추측합니다 : ADD . /etc/crontab그것이 작동하지 않기 때문입니다.
— TomFirth

@TomFirth : 이치에 맞지 않습니다. 자세한 내용은 내 편집 내용을 읽으십시오.
— Sven
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.