한줄요약: crontab.txt 권한 상승 필요
다른 호스트 머신에서 잘 동작하던 docker image를 새로운 호스트 머신에 컨테이너로 띄우게 되었다
docker-compose.yml을 통해 컨테이너를 up 시켰다
Dockerfile의 내용:
...
ENTRYPOINT ["./entrypoint.sh"]
CMD ["cron", "-f", "-l", "2"]
docker-compose의 내용:
services:
service-name:
...
volumes:
- ./config/crontab.txt:/etc/cron.d/crontab
...
crontab의 내용:
* * * * * root /venv/bin/python /app/main.py
container를 띄울 때 crontab을 마운트시키고, container가 뜨면서 entrypoint로 cron 이 실행되고, 매 분마다 crontab에 등록된 job이 돌게 되어 있다
문제는 크론탭에 등록된 job을 직접 쉘에 실행시키면 문제가 없는데, cronjob이 매 분마다 트리거되지 않는 것이었다
구글링을 해봐도 적절한 해결책이 보이지 않아서
챗지피티한테 물어봤다
docker container을 띄우는데
호스트머신의 crontab 파일을 컨테이너의 /etc/cron.d/crontab 으로 mount시켜서 띄웠어
그리고 container의 entrypoint 명령어는 cron -f -l 2 야
그런데 일부 컨테이너에서 크론잡이 트리거가 안 되고 있어
챗지피티가 알려줬다
파일 권한 확인:
마운트된 crontab 파일의 권한이 올바른지 확인하세요. cron이 실행되려면 파일의 소유자가 root이고, 파일 권한이 적절하게 설정되어 있어야 합니다.
crontab 파일 형식 확인: ...
로그 확인: ...
컨테이너 환경 설정 확인: ...
crond 서비스 확인: ...
호스트와 컨테이너의 시간 동기화: ...
밑에는 읽을 것도 없이 1번으로 알려준 것이 원인이었다
호스트 머신:
$ ls -al config/crontab.txt
-rw-r--r-- 1 user user 863 Jul 31 14:21 config/crontab.txt
도커 컨테이너:
# ls -al /etc/cron.d/crontab
-rw-r--r-- 1 1000 1000 863 Jul 31 14:21 /etc/cron.d/crontab
root 권한이 아닌 것을 알 수 있다
$ sudo chown root:root config/crontab.txt
위 명령어를 통해 호스트 머신의 파일 권한을 바꾸고 다시 docker compose up을 했더니 cronjob이 매 분마다 잘 돌았다
챗지피티의 답변 전문
1. **파일 권한 확인**:
- 마운트된 crontab 파일의 권한이 올바른지 확인하세요. cron이 실행되려면 파일의 소유자가 root이고, 파일 권한이 적절하게 설정되어 있어야 합니다.
```sh
chmod 0644 /etc/cron.d/crontab
chown root:root /etc/cron.d/crontab
```
2. **crontab 파일 형식 확인**:
- crontab 파일의 형식이 올바른지 확인하세요. cron 형식은 "분 시 일 월 요일 사용자 명령어" 형식을 따릅니다.
- 특히 사용자 필드를 잊지 않았는지 확인하세요. `/etc/cron.d` 디렉토리의 crontab 파일은 사용자 지정이 필요합니다.
3. **로그 확인**:
- cron이 실행되지 않는 이유를 파악하기 위해 로그를 확인하세요. 컨테이너 로그나 cron 로그를 확인해 보세요.
```sh
docker logs <container_id>
tail -f /var/log/cron.log
```
4. **컨테이너 환경 설정 확인**:
- 컨테이너가 올바른 시간대(TZ)를 사용하고 있는지 확인하세요. 잘못된 시간대 설정은 cron 작업이 예상과 다르게 동작하게 할 수 있습니다.
```sh
docker run -e TZ=Asia/Seoul ...
```
5. **crond 서비스 확인**:
- cron 데몬이 제대로 실행되고 있는지 확인하세요. `cron -f` 명령어로 실행하는 것은 포그라운드에서 cron 데몬을 실행하는 방식으로, 로그 레벨 2로 설정하여 로그를 더 많이 출력하도록 합니다. 이것이 올바르게 동작하는지 확인합니다.
```sh
ps aux | grep cron
```
6. **호스트와 컨테이너의 시간 동기화**:
- 호스트와 컨테이너의 시간이 일치하는지 확인합니다. Docker 컨테이너의 시간은 기본적으로 호스트의 시간을 따르지만, 환경에 따라 달라질 수 있습니다.
'개발 이야기' 카테고리의 다른 글
"한 권으로 배우는 도커 & 쿠버네티스" 도서 리뷰 (30) | 2024.11.25 |
---|---|
"차세대 빅데이터 플랫폼 Data Lake" 도서 리뷰 (15) | 2024.11.14 |
🤫 Secrets, 소스 코드를 통한 유출 방지 (0) | 2024.08.17 |
Clickhouse 데이터 파일 깨짐 현상 복구 (0) | 2024.06.27 |
superset 설치 troubleshooting (3) | 2024.05.21 |