docker에서 crontab 동작

2017. 2. 21. 11:49Server/Ubuntu

docker container 내에 서비스를 구축하고 나서 crontab으로 스케쥴을 걸어 놓으려고 했는데.. 


'아뿔사!!!'


docker container 내에서 crontab이 동작을 하지 않는다...


몇 몇의 링크를 찾아본 결과


https://www.ekito.fr/people/run-a-cron-job-with-docker/


docker file을 만들때 crontab 까지 함께 만들어서 이미지로 구워주어야 하는 것 같다.


그런데 이렇게 되면 crontab을 수정할 때마다 이미지를 새로 구워야 하기 때문에, 다른 방법을 찾아보기로 했다.


해결책은 의외로 간단했는데, 아래의 명령어를 응용함으로써 해결했다.


$> sudo docker exec -it [컨테이너명] /bin/bash


docker container 내에 스케쥴을 걸 스크립트 파일을 만들어 놓고, docker 외부에서 해당 docker container의 스크립트를 주기적으로 실행하면 해결되는 문제였다.


위의 명령어에서 /bin/bash 위치에 docker container 내의 실행할 명령어와 스크립트를 명시해 주면 된다.


$> sudo docker exec -it [컨테이터명] python /root/test.py


위의 코드가 실행되는 스크립티를 a.sh라고 한다면 docker container 외부 서버에서 해당 a.sh를 crontab에 등록하면 주기적으로 위의 명령어가 실행이 되고 자연스레 docker container 내부에서 해당 script가 실행이 될 것이다.

참고로 crontab 등록시에는 -it 옵션을 빼야 정상 동작함을 잊지 말자. crontab의 경우 interactive 환경을 쓸 필요가 없기 때문에 -i 옵션을 넣어줄 필요가 없으며 terminal 이용도 필요 없기 때문에 -t 옵션도 빼주자.



추가로 docker container를 실행하면 date가 맞지 않는 문제가 발생한다. 서비스 실행시에는 치명적인 문제가 될 수 있으며 처음 docker container를 만들때 "-e TZ=Asia/Seoul" 이 구문을 추가해 주면 된다.


$> sudo docker run -it --name=test -e TZ=Asia/Seoul -p 8000:8000 -v work:/work test:0.1


docker container는 실행 시마다 다른 mac-address를 가지는데 container를 만들 때, mac-address를 지정할 수도 있다.


$> sudo docker run -it --name=test --mac-address="00:AC:12:33:42:15" -p 8000:8000 -v work:/work test:0.1