SW 개발

[Docker] Docker Tip - cron 간단하게 구성하기

. . . 2021. 4. 22. 21:52
반응형

docker 에서 각종 cron 구성하는 방법들을 검색해보다가 별로 마음에 드는 방법들이없어서, 고민하여~ 간단하게 구성하는 방법을 소개한다.

cron 구성?

간단하다. docker 를 하나의 서비스 머신?으로 활용하기 위해서... cron 을 구성하여 주기적인 동작을 하도록 하는데 쓰면된다.

필자는 캠핑장 크롤링을 할때... 낮시간에 주기적으로 크롤링 하도록 cron 으로 구성하여 활용중이다.

cron 구성하기

1. Dockerfile 만들기

사실 cron 기능만을 위해서, 누군가 만들어놓은 docker image 를 pull 하는건 좀 비효율적이라고 생각한다.

간단한 Dockerfile 을 만들어서 나만의 cron 이미지를 구성하자

Dockerfile

FROM ubuntu:18.04

ARG DEBIAN_FRONTEND=noninteractive

############################################
# base tool
############################################
RUN apt-get update
RUN apt-get install -y --no-install-recommends apt-utils

###############################################
# cron
###############################################
RUN apt-get install cron

###############################################
# entry point
###############################################
RUN touch /usr/sbin/entrypoint.sh
RUN chmod 777 /usr/sbin/entrypoint.sh

ENTRYPOINT ["/usr/sbin/entrypoint.sh"]

위와같이 구성한다. 위의내용을 설명하면..

  1. FROM ubuntu:18.04 : ubuntu 18.04 이미지를 base image 로 사용한다. 물론 다른버젼의 우분투버젼을 사용해도 된다.
  2. RUN apt-get install cron : cron 을 사용하기위해 cron 패키지를 설치한다.
  3. ENTRYPOINT ["/usr/sbin/entrypoint.sh"] : cron 을 실행하기위해서 entry point 를 실행하게 한다.

entrypoint.sh 에서 cron 을 실행하면 간단하게 cron 구성 완료된다.

2. entrypoint.sh 구성하기

entrypoint.sh

#!/bin/bash

# run cron
chmod 644 /etc/cron.d/root
chown root:root /etc/cron.d/root

cron

########################################
# your package setting
########################################

while :
do
  sleep 600
done

즉, docker 시작시 cron 데몬을 실행하고 시작한다.

  • docker 시작할때 entrypoint.sh 이 내용이 자동실행되므로 entrypoint.sh 파일은 chmod 777 entrypoint.sh 권한을 준다.
  • cron 스케쥴을 설정하는 /etc/cron.d/root 파일은 root 사용자에, 권한은 644로 맞춘다.

3. docker-compose.yml, cron 스케쥴 파일 구성하기

위와같이 Dockerfile , entrypoint.sh 파일을 만든후에 docker 를 만들기위해 다음과 같이 docker-compse.yml 을 구성한다.

docker-compose.yml

version: '3'
services:
  cron-img-d:
    image: cron-img-d
    container_name: cron-img-d
    build:
       context: .
       dockerfile: ./Dockerfile
    volumes:
      - ./entrypoint.sh:/usr/sbin/entrypoint.sh
      - ./cron/:/etc/cron.d/
      - ./files/:/root/files/
    restart: on-failure
  • build 내용을 추가하여 같은 폴더내의 Dockerfile 을 이용한 도커이미지를 생성한다.
  • volumes 내용을 추가하여, entrypoint.sh 와 cron 스케쥴 파일을 추가한다.
    • docker 시작할때 entrypoint.sh 이 내용이 자동실행되므로 entrypoint.sh 파일은 chmod 777 entrypoint.sh 권한을 준다.
    • /etc/cron.d/ 폴더밑에 root 파일을 구성하여 cron 을 주기적으로 실행하게 한다.

cron 스케쥴을 담은 root 파일은 다음과 같이 구성한다. (cron 문법을 따른다.)

*/1 * * * * root /root/files/mytest.sh >> /root/files/mytest.log

예제 프로젝트

위의 내용을 코드로 구성하였다.

https://github.com/kksworks/docker-cron-example

  • 사용법
    • docker-compose up -d 명령어를 입력하면, 이미지만들고 컨테이너 실행
    • 1분마다 cron 기본서비스 동작
    • 로그로 동작확인완료
반응형