Docker container에서 cron을 이용한 스케줄링
포스트
취소

Docker container에서 cron을 이용한 스케줄링

cron은 유닉스 계열에서 사용가능한 잡 스케쥴러이다. 정기적으로 또는 특정 주기를 따라서 동작을 하고 싶을때 이용할 수 있다.

docker-compose를 이용하여 컨테이너 실행시 바로 cron을 등록하고 스케줄링을 하고 싶었는데 대부분 아래와 같은 방법으로 알려주고 있었다.

1
2
$ crontab -e  # 등록 (에디터를 이용해서 작성)
$ crontab -l  # 등록된 잡 확인.

물론 이렇게 해도 상관은 없지만 에디터로 직접 등록을 해줘야 하기 때문에 docker-compose를 통한 자동화를 할수 없었다. 이걸 해결하기 위해서 cron 수식을 직접 등록해주는 방법으로 진행하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Dockerfile

FROM ubuntu:20.04

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update
RUN apt-get install -y --no-install-recommends apt-utils
RUN apt-get install cron

RUN apt-get update && apt-get install -y \
    python3 \
    python3-pip

RUN python3 -m pip --no-cache-dir install --upgrade \
    "pip<20.3" \
    setuptools

RUN ln -s $(which python3) /usr/local/bin/python

COPY ./main.py /test/main.py
COPY ./root /etc/cron.d/root

RUN chmod 0644 /etc/cron.d/root
RUN chmod +x /test/main.py

RUN touch /var/log/test.log
CMD cron && tail -f /var/log/test.log

주기적으로 실행할 파일 main.py와 cron 명령어가 들어있는 파일 root를 이동시켜준다. 그다음 각각 퍼미션을 할당한다.

root 파일은 /etc/cron.d/에 위치시키는데 cron 명령어 실행시 여기에 위치한 파일들을 job으로 등록하는것 같았다. (자세한 정보는 조금 여유로울때 다시 조사..)

1
2
3
4
from datetime import datetime

if __name__ == '__main__':
    print(datetime.now(), 'test')
1
* * * * * root /usr/local/bin/python /test/main.py >> /var/log/test.log 2>&1

간단하게 1분 간격으로 현재 시간을 출력하고 이를 로그로 기록해 보았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
test_1  | 2022-07-01 06:52:01.822615 test
test_1  | 2022-07-01 06:53:01.857943 test
test_1  | 2022-07-01 06:54:01.892707 test
test_1  | 2022-07-01 06:55:01.927534 test
test_1  | 2022-07-01 06:56:01.962774 test
test_1  | 2022-07-01 06:57:02.003161 test
test_1  | 2022-07-01 06:58:01.042311 test
test_1  | 2022-07-01 06:59:01.079271 test
test_1  | 2022-07-01 07:00:01.115631 test
test_1  | 2022-07-01 07:01:01.149939 test
test_1  | 2022-07-01 07:02:01.186468 test
test_1  | 2022-07-01 07:03:01.226175 test
test_1  | 2022-07-01 07:04:01.263987 test
test_1  | 2022-07-01 07:05:01.299888 test
test_1  | 2022-07-01 07:06:01.338136 test
test_1  | 2022-07-01 07:08:01.414428 test

정확히 1분은 아니고 조금의 오차는 발생하나 크게 영향을 줄 정도는 아닌것 같다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

openvpn 원격으로 켜고 끄기

블로그 이전