본문으로 바로가기

Docker Crontab 관련 이슈사항 정리

category Coding 2019. 5. 22. 13:00
반응형

데이터를 동기화시키기 위해 기존 컨테이너가 아닌 추가적인 컨테이너를 띄워야하는 상황이 발생했다. 따라서 크론 관련 이미지를 알아보던 중 그냥 익숙한 우분투에 크론잡을 설치하여 사용하기로 결정했다. 진행하던 중 생각치도 못한 이슈들이 몇가지 발생하여 이렇게 기록한다. 아마 많은 사람들이 동일하게 겪는 증상이라고 생각하며 본 포스팅이 조금이나마 도움이 됐으면 한다.


1. 크론잡이 실행되는 쉘의 환경변수와 도커로 접속했을 때 쉘의 환경변수가 다르다. 따라서 만약 특정 프로그램을 실행시킬 때 환경변수가 필요한 상황이라면, crontab -e로 잡을 스케쥴링할 때 최상단에 환경변수도 같이 명시해줘야한다. ex) PATH=1


2. Dockerfile에 RUN service cron start와 같이 크론 서비스를 실행시키는 라인을 추가했는데, 빌드단계에서는 적용이 되지만 실제 컨테이너를 실행시켜보면 크론 서비스가 실행되지 않는 상태였다. 따라서 아래와 같은 명령어를 통해 실행 단계에서 서비스를 실행시키는 방법으로 수정하였다.


service cron start && while true; do sleep 1000; done


&& while true; do sleep 1000; done을 붙여준 이유는 컨테이너를 계속 실행상태로 유지하기 위함이다. 도커 컨테이너는 명령어를 실행하고 명령어가 끝나면 종료되는 형태이므로 지속적으로 컨테이너를 띄워주기 위함이다.


3. crontab -e로 크론잡에 스케쥴링을 등록하지않고 커맨드라인으로 한번에 등록하고 싶었다. 따라서 아래와 같은 명령어를 Dockerfile에 명시해줬다.


RUN (crontab -l 2>/dev/null; echo "* * * * * /usr/bin/python3 /home/manage.py sync") | crontab -


결과적으로 내가 작성한 Dockerfile은 아래와 같다.


FROM ubuntu:18.04
MAINTAINER john <john@cupist.com>

COPY Pipfile ./home
COPY Pipfile.lock ./home
COPY . ./home
RUN chmod 777 /home
WORKDIR /home
RUN apt-get update
RUN apt-get install -y software-properties-common
RUN add-apt-repository -y ppa:ubuntu-toolchain-r/ppa
RUN apt-get install -y python3.7
RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2
RUN apt-get install -y python3-pip

# 아래 두개 환경변수는 pipenv 오류를 방지하기 위함
ENV LC_ALL C.UTF-8
ENV LANG C.UTF-8

RUN pip3 install pipenv
RUN apt-get install -y vim && cron
RUN apt-get install -y cron
RUN pipenv install --system
RUN chmod 777 /home/jobs/data_synchronize/run.sh

ENTRYPOINT /home/jobs/data_synchronize/run.sh


#!/bin/bash
(crontab -l 2>/dev/null; echo "CACHE_ADDR=$CACHE_ADDR") | crontab -
(crontab -l 2>/dev/null; echo "CACHE_PORT=$CACHE_PORT") | crontab -
(crontab -l 2>/dev/null; echo "DJANGO_CONFIGURATION=$DJANGO_CONFIGURATION") | crontab -
(crontab -l 2>/dev/null; echo "AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID") | crontab -
(crontab -l 2>/dev/null; echo "AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY") | crontab -
(crontab -l 2>/dev/null; echo "* * * * * /usr/bin/python3 /home/manage.py sync") | crontab -
service cron start && while true; do sleep 1000; done


반응형