docker 안에서 주기적인 작업(cron) 처리하기

문제 : docker 컨테이너 안에서 cron job을 돌리고 싶었습니다.


2016년 3월 7일 업데이트

이 문제를 DockerKorea 모임에 문의했더니 cron 처리를 위한 별도의 프로그램을 추천해주셨습니다. python-crontab이나 go-cron 등이요.

한편, 주기적인 작업에는 cron 대신 celery를 사용하는 방법도 많이 사용된답니다.


docker 내에서 일반적인 cron 설정 방법

일단 제가 찾아 본 일반적인 설정은 다음과 같습니다.

1. docker 이미지에 cron 설치 (cron 없는 이미지도 있으니까)
# Dockerfile
RUN apt-get install -y cron
2. cronjob.txt 파일 생성
# cronjob.txt
*/5 * * * * root echo "hello cron" >> /dev/stdout
3. cronjob.txt/etc/cron.d/에 복사
# Dockerfile
ADD ./etc/cronjob.txt   /etc/cron.d/
4. supervisor 등의 프로세스 관리자에 cron을 등록
# supervisord.conf
[program:cron]
command = cron -f -L 15
autostart = true
autorestart = true
5. 컨테이너 실행
$ docker run -d image_name 

그런데 저는 이게 잘 안 되더군요. (혹시 틀린 부분이 있다면 알려주세요. 다시 시도해보겠습니다. ㅠㅠ)

그러던 중에 uwsgi에서 cron을 지원한다는 이야기를 들었습니다. 어차피 고통받는 상황이니, 밑져야 본전이라는 생각으로 시도를 해봤습니다.

uwsgi에서 cron 설정하기

1. uwsgi.ini 파일에 다음 내용을 추가합니다.
[uwsgi]
-5 -1 -1 -1 -1 echo "hello cron" >> /dev/stdout

crontab에서 *로 설정하는 부분을 uwsgi에서는 -1로 설정하고, 주기적인 작업을 위해 */5로 설정하는 부분을 uwsgi에서는 -5로 설정하면 됩니다. (더 인간 친화적인 설정 방법도 있으니 문서를 참고하세요~)

끝입니다. -_-;

테스트할 땐, 출력을 /dev/stdout이 아닌 /var/log/cron.log 같은 로컬 파일로 바꾼 다음에 확인을 해봤습니다. 잘 되더군요.

결론: uwsgi 설치된 서버에서 cron 작업할 땐 uwsgi 쓸게요.

Show Comments