Dockerfile Script를 작성하면서 container를 띄울때
아무리 -d 옵션을 주고 --restart always 옵션을 주어도 무한 restart에 걸리기만 하고 container가 정상적으로 유지되지 않았다.
이유를 찾아보니, Docker는 앱의 실행과 배포에 초점이 맞춰져 있기 때문에 내부에서 실행중인 프로세스가 없는경우 자동으로 종료해 버린다.
그렇기 때문에 Container 내부에는 항상 어떤 프로세스가 돌고 있어야 한다..!
잘 생각해 보면, 일반적으로 Docker Image를 다운받고 실행해보면 항상 container 내부의 bash로 접속하는 경우가 많았는데, 이게바로 Dockerfile에 CMD로 "bash" 프로세스를 항상 실행시켜 유지하므로써, container가 종료되지 않는것이었다.
또한 container를 실행시킬 때, 버릇처럼 사용하던 옵션인
# docker run exec -it [container] [image:tag]
이 명령어를 치면 CMD에 자동으로 "/bin/bash"가 설정되기 때문에 해당 container가 유지되는 것이었다...기본기의 중요성
실제 Docker Hub의 Ubuntu20.04 Dockerfile Script
이제 이 방법을 해결하는 방법은 다양한데
위에서 말한 것 처럼 -it 옵션을 주고 실행시키는 방법과
Dockerfile의 마지막에 CMD 또는 ENTRYPOINT를 넣어서 container 실행시, ps를 유지하는 방법이 있다.
나는 최종 목표가 자동화 스크립트기 때문에 Dockerfile에 CMD 명령어를 추가해주는 방법을 사용했다.
# project/Dockerfile
FROM ubuntu:20.04
...
CMD tail -f /dev/null
이 명령어는 일반적으로 로그파일이 업데이트 되는것을 지속적으로 지켜볼 때 사용하곤 하는데, container가 계속해서 null device file을 읽게 되면서 종료되지 않을 수 있다.
bash를 쓰지 않은 이유는 Dockerfile조차 Shell Script로 실행시키게 되어있는데, 중간에 container가 실행되면서 bash로 진입하게 되면 Shell Script가 끝까지 정상적으로 실행되지 않기 때문이다.
Ref.
'의지박약 > DevOps' 카테고리의 다른 글
[Shell Script] .env 파일 읽어오기 (0) | 2021.09.14 |
---|---|
[Shell Script] 쉘 스크립트에서 config.ini 파일 읽고 쓰기 (feat. konfig) (0) | 2021.09.08 |
[docker] Dockerfile 빌드시 timezone 설정 때문에 설치되지 않는 오류 (tesseract) (0) | 2021.08.23 |
[docker] unable to prepare context: unable to evaluate symlinks in Dockerfile path Error (0) | 2021.08.23 |
[docker] 실행중인 Container to Image 그리고 Port, Volume 추가 (0) | 2021.07.13 |
댓글