개발 이야기

Docker container에서 cronjob이 trigger되지 않던 문제 해결

inspiring-ini 2024. 8. 1. 18:06

한줄요약: crontab.txt 권한 상승 필요


 

다른 호스트 머신에서 잘 동작하던 docker image를 새로운 호스트 머신에 컨테이너로 띄우게 되었다

docker-compose.yml을 통해 컨테이너를 up 시켰다


Dockerfile의 내용:

...
ENTRYPOINT ["./entrypoint.sh"]
CMD ["cron", "-f", "-l", "2"]

 

docker-compose의 내용:

services:
  service-name:
    ...
    volumes:      
      - ./config/crontab.txt:/etc/cron.d/crontab
	...

 

crontab의 내용:

* * * * * root /venv/bin/python /app/main.py

 

container를 띄울 때 crontab을 마운트시키고, container가 뜨면서 entrypoint로 cron 이 실행되고, 매 분마다 crontab에 등록된 job이 돌게 되어 있다

 

문제는 크론탭에 등록된 job을 직접 쉘에 실행시키면 문제가 없는데, cronjob이 매 분마다 트리거되지 않는 것이었다

 

구글링을 해봐도 적절한 해결책이 보이지 않아서

챗지피티한테 물어봤다

docker container을 띄우는데
호스트머신의 crontab 파일을 컨테이너의 /etc/cron.d/crontab 으로 mount시켜서 띄웠어
그리고 container의 entrypoint 명령어는 cron -f -l 2 야
그런데 일부 컨테이너에서 크론잡이 트리거가 안 되고 있어

 

챗지피티가 알려줬다

파일 권한 확인:
마운트된 crontab 파일의 권한이 올바른지 확인하세요. cron이 실행되려면 파일의 소유자가 root이고, 파일 권한이 적절하게 설정되어 있어야 합니다.

crontab 파일 형식 확인: ...
로그 확인: ...
컨테이너 환경 설정 확인: ...
crond 서비스 확인: ...
호스트와 컨테이너의 시간 동기화: ...

 

 

밑에는 읽을 것도 없이 1번으로 알려준 것이 원인이었다

 

호스트 머신:

$ ls -al config/crontab.txt
-rw-r--r-- 1 user user 863 Jul 31 14:21 config/crontab.txt

 

도커 컨테이너:

# ls -al /etc/cron.d/crontab
-rw-r--r-- 1 1000 1000 863 Jul 31 14:21 /etc/cron.d/crontab

 

root 권한이 아닌 것을 알 수 있다

 

$ sudo chown root:root config/crontab.txt

위 명령어를 통해 호스트 머신의 파일 권한을 바꾸고 다시 docker compose up을 했더니 cronjob이 매 분마다 잘 돌았다

 

 

챗지피티의 답변 전문

더보기

1. **파일 권한 확인**:
   - 마운트된 crontab 파일의 권한이 올바른지 확인하세요. cron이 실행되려면 파일의 소유자가 root이고, 파일 권한이 적절하게 설정되어 있어야 합니다.
     ```sh
     chmod 0644 /etc/cron.d/crontab
     chown root:root /etc/cron.d/crontab
     ```

2. **crontab 파일 형식 확인**:
   - crontab 파일의 형식이 올바른지 확인하세요. cron 형식은 "분 시 일 월 요일 사용자 명령어" 형식을 따릅니다.
   - 특히 사용자 필드를 잊지 않았는지 확인하세요. `/etc/cron.d` 디렉토리의 crontab 파일은 사용자 지정이 필요합니다.

3. **로그 확인**:
   - cron이 실행되지 않는 이유를 파악하기 위해 로그를 확인하세요. 컨테이너 로그나 cron 로그를 확인해 보세요.
     ```sh
     docker logs <container_id>
     tail -f /var/log/cron.log
     ```

4. **컨테이너 환경 설정 확인**:
   - 컨테이너가 올바른 시간대(TZ)를 사용하고 있는지 확인하세요. 잘못된 시간대 설정은 cron 작업이 예상과 다르게 동작하게 할 수 있습니다.
     ```sh
     docker run -e TZ=Asia/Seoul ...
     ```

5. **crond 서비스 확인**:
   - cron 데몬이 제대로 실행되고 있는지 확인하세요. `cron -f` 명령어로 실행하는 것은 포그라운드에서 cron 데몬을 실행하는 방식으로, 로그 레벨 2로 설정하여 로그를 더 많이 출력하도록 합니다. 이것이 올바르게 동작하는지 확인합니다.
     ```sh
     ps aux | grep cron
     ```

6. **호스트와 컨테이너의 시간 동기화**:
   - 호스트와 컨테이너의 시간이 일치하는지 확인합니다. Docker 컨테이너의 시간은 기본적으로 호스트의 시간을 따르지만, 환경에 따라 달라질 수 있습니다.