- springboot
- Docker
- 자바
- nginx
- DI
- spring boot
- 스프링부트
- sql
- AWS
- spring
- PYTHON
- spring security 6
- ORM
- 1차원 배열
- Django
- join
- 스프링
- Git
- java
- mysql
- select
- @transactional
- SSL
- session
- 프로그래머스
- 데이터베이스
- string
- 문자열
- spring mvc
- jpa
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
개발하는 자몽
[Django] django-crontab & Docker 본문
목적
`django-crontab`을 사용하여 쉽게 `crontab`을 적용해 보고, 도커 컨테이너에서 실행시켜 보자!
cron & crontab & cronjob
- `cron` : 실행 도구
- `crontab`: `cron`이 실행할 일(job)이 담긴 파일
- `cronjob`: `crontab`에 작성한 일(job)
django-crontab 설정 with Docker
`pip`로 `django-crontab`을 설치합니다.
pip install django-crontab
설치 후 `settings.py`에 아래 코드를 추가합니다.
INSTALLED_APPS = [
...
'django_crontab',
]
...
CRONJOBS = [
('*/30 * * * *', 'app.cron.hello', '>> /var/log/cron.log 2&>1 '),
]
위 코드는 `app/cron.py`에 정의된 `hello` 함수를 `cron`으로 매일 30분마다 실행하고, 로그를 서버 내 위치한 `/var/log/cron.log`에 쌓는다는 의미입니다. 마지막에 `2&>1`은 '표준에러를 표준출력 동작으로 재지정'한다는 의미입니다. 따라서 에러도 로그파일에 쌓이게 되며, 사용자는 실행 중 `hello` 함수에서 발생하는 에러를 보지 않게 됩니다.
`cron`이 서비스가 실행되고 있는 컨테이너와 별도의 컨테이너에서 실행되도록 `Dockerfile`과 `docker-compose.yml` 파일을 작성합니다.
`Dockerfile`은 이미지 생성을 위한 설정 파일입니다. 아래에 적은 `Dockerfile`의 내용을 토대로 이미지가 생성됩니다.
# Dockerfile
...
# for django-crontab
RUN chmod -R 777 /toy_server # 권한 설정
RUN apt-get update && \
apt-get install -y cron && \ # crontab 설치
touch /var/log/cron.log # 로그 파일 생성
...
아래의 `docker-compose.yml` 파일은 Django 서버와 `django-crontab`을 별도의 컨테이너에서 실행시키기 위한 설정을 담고 있습니다.
version: "3"
services:
_build_image:
image: toy_server_image
build: .
django_server:
image: toy_server_image
command: python manage.py runserver 0.0.0.0:8000
ports:
- 8000:8000
depends_on:
- _build_image
cron:
image: toy_server_image
restart: always
command: bash -c "service cron start && python toy_server/manage.py crontab add && tail -f /dev/null"
depends_on:
- django_server
`cron` 서비스의 `command`에서 `service … && … crontab add` 만 실행하면 스케줄러에 `crontab` 작업을 등록하는 작업이 끝났을 때 컨테이너가 종료됩니다. `tail -f /dev/null` 코드를 추가하여 작업 등록 이후에도 컨테이너가 종료되지 않도록 설정합니다.
`docker-compose.yml` 파일까지 다 작성했다면 터미널에 `docker compose up`을 입력하여 컨테이너를 실행합니다. 이때 `docker-compose.yml` 파일만 수정한 것이 아닌 애플리케이션의 `Dockerfile`도 수정했기 때문에 `--build` 플래그를 추가합니다. 이는 컨테이너를 시작하기 전에 이미지를 빌드하여 변경된 이미지를 다시 생성하기 위함입니다. 그 외에 각자 개발 현황에 맞춰서 `docker compose`를 하고 싶다면 `docker-compose `명령어를 찾아보시기 바랍니다.
docker compose up --build
빌드가 완료되었다면 `cron`이 실행되고 있는 도커 컨테이너 내부에서 `crontab -l` 명령어를 입력하여 `crontab`이 등록되었는지 확인합니다. `crontab`에 아무것도 등록되어 있지 않다면 `no crontab for root`와 같은 문구가 나타납니다.
참고 django-crontab 라이브러리 링크 및 설명 https://pypi.org/project/django-crontab/
참고 cron 스케줄러의 시간 설정을 도와주는 사이트 https://crontab.guru/#*_*_*_*_*
'Python > Django' 카테고리의 다른 글
[Django] Swagger를 이용한 API Documentation (0) | 2024.01.20 |
---|---|
[Django] 배포 환경에서 Nginx로 media file 제공하기 on Docker (0) | 2024.01.13 |
[Django] 환경변수 관리 (django-environ) (1) | 2024.01.06 |
[Django] 개발 환경 분리 (1) | 2023.12.30 |
[Django / TIL] request와 requests (0) | 2023.10.30 |