
EC2에서 docker-compose down && docker-compose up -d
를 자동으로 돌리는 bash script 만들기(crontab 이용)
전 포스트들을 보면 알 수 있듯 난 이미 deploy.yml에 docker-compose를 재시작하도록 코드를 작성해두었는데, 왜 EC2안에서 한번 더 해야할까? 라는 궁금증이 생겨 GPT에게 물어봤더니,
GPT 답변:
그 deploy.yml이 GitHub Actions Workflow 파일이라면,
그건 "내가 GitHub에 push할 때 EC2에 git pull하고, docker-compose 재시작하는 것"을 자동화한 거지.
근데 그건 "코드가 바뀌었을 때만" 실행되잖아.
예를 들면: 코드 변경 → push → GitHub Actions → EC2에서 재시작
그런데 만약:
코드 변경 없이, EC2에서 컨테이너가 죽었다거나,
서버가 오래 켜져 있어서 리소스가 부족하다거나,
컨테이너가 이유 없이 멈췄다거나
이런 경우에도 주기적으로 EC2를 재시작하거나,
docker-compose를 재시작하게 하면
서버의 안정성이 높아지는 거야.
요약하면 서버의 리소스 회수, 메모리 누수 방지, 컨테이너 안정화를 위해 자동화 스크립트를 작성해주는 게 좋다고 한다.
난 내 EC2를 항상 켜두진 않기 때문에(요금이 ^_ㅜ)
굳이 필요할까? 싶었지만 알아두면 좋을 것 같아 실습 해봤다.
간단하다
스크립트 파일을 하나 만들어 docker-compose down과 docker-compose up -d를 적어주면 된다
#!/bin/bash
echo "[$(date)] Restarting Docker containers..." >> /home/ubuntu/restart.log
docker-compose down
docker-compose up -d
echo "[$(date)] Restart complete." >> /home/ubuntu/restart.log
GPT가 로그 파일도 남겨두는게 좋다고 추천해줘서 로그파일을 남길 수 있도록 코드를 추가했다.
여기서 잠깐, crontab이 뭘까?
윈도우의 스케쥴러와 비슷, "특정 시간에 특정 작업"을 해야할 때 crontab으로 작업을 설정해줄 수 있다.
crontab -e를 입력 하면 텍스트 에디터를 고르는 창이 뜰텐데 nano로 선택하는게 편하다 :)crontab -l을 하면 crontab에 어떤 내용이 들어있는지 알 수 있다.
#매주 금요일 오전 5시 45분에 test.sh 를 실행
45 5 * * 5 /home/script/test.sh
#매일 매시간 0분, 20분, 40분에 test.sh 를 실행
0,20,40 * * * * /home/script/test.sh
#매주 수요일 오전 11시에 restart.sh를 실행
0 11 * * 3 /home/ubuntu/restart.sh
원하는 주기 대로 시간을 입력해주고 저장하면 정해둔 시간마다 작업이 실행된다.
crontab 실행 전 bash restart.sh로 실행 시켰을때 찍힌 로고의 date가 UTC 기준으로 떠서 정확한 시간이 맞는지 확인하기 쉽지 않았다.
바로 구글 검색을 해 tzdata 패키지를 알아냈고 설치했다.
sudo apt -y install tzdata
sudo timedatectl set-timezone Asia/Seoul
timedatectl
date
date를 찍어보면 Wed Jul 23 12:23:27 KST 2025 라는 결과가 잘 나온다.
실습할 때 한번에 제대로 진행된 적이 없듯 오늘도 그랬다.
미리 설정해두지 않은 여러 절차가 있었다.
chmod +x restart.sh 해줘야한다.PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 첫 줄 밑에 적어주었다.which docker-compose 이렇게 적어 docker-compose 명령어의 절대 경로를 확인 후 스크립트에 절대경로로 명령어를 적어주는 것이다.수정코드
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
LOGFILE="/home/ubuntu/restart.log"
echo "[$(date)] Restart script start" >> $LOGFILE
sudo /usr/local/bin/docker-compose -f /home/ubuntu/Devops/docker-compose.yml down >> $LOGFILE 2>&1
sudo /usr/local/bin/docker-compose -f /home/ubuntu/Devops/docker-compose.yml up -d >> $LOGFILE 2>&1
echo "[$(date)] Restart script complete" >> $LOGFILE
참고: 2>&1은 에러도 같은 파일로 리다이렉트
근데 docker의 절대경로는 usr/bin/docker던데
왜 docker-compose는 usr/local/bin/docker-compose일까? 신기하네..
작성 중에 vi 에디터를 써서 편집도 했는데,
단어 치환이 필요해서 검색으로 찾아내어 적었다.
%s/[원본단어]/[바꿀단어]/옵션 ex) %s/myapp/Devops/g
g는 전역을 의미.

restart.log를 cat했을때 로그가 잘 남아있는 걸 확인 할 수 있었다.
UTC -> KST로 바뀐거 보니까 마음이 편안하다.
다음은 Nginx + HTTPS 복습을 할 것 이다.
학습 참고 링크 출처: