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


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/395574serverfault.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.