나의 문제 상황
1. 도커
1.1 Docker로 Backend서비스를 실행하려고한다
1.2. Backend서비스는 5000포트로 Flask를 실행한다
2. 도커 컨테이너 내부의 디버거
2.1 Vscode로 Docker 컨테이너 내부에서 디버거로 Flask를 실행하며 5000번 포트로 동작시킨다
2.2 Docker실행시 사용한 5000번 포트와 Docker컨테이너 내부에서 디버깅으로 동작하는 5000포트가 동일하기에 충돌한다
2.3 그렇다고 도커에서 서비스 시작시 사용한 포트로 5005등의 다른 포트를 사용히면 5005 (도커실행용) , 5000(디버깅용) 으로 Flask를 두번 실행하게 되어 불필요한 프로세스를 사용한다
해결책
도커 서비스를 실행시 아래와 같은 처리를 해준다
tail -f /dev/null
tail -f 파일의 마지막 끝을 계속 읽어들임
/dev/null 리눅스의 휴지통
존재하지 않는 공간을 계속 읽어들임으로써 무한 루프를 생성한다
그래서 프로세스를 종료하지않고 계속 실행되게 할수있다
docker command를 이용하는 경우
docker run --entrypoint "tail -f /dev/null"
Dockerfile을 이용하여 이미지를 빌드하는 경우
# project/Dockerfile
FROM dockerimage:dockerimageversion
CMD tail -f /dev/null
docker-compose.yml파일을 이용하여 컨테이너를 실행하는 경우
# project/docker-compose.yml
version: "X"
services:
service_name:
container_name: container_name
image: docker_image
volumes:
- ./:/app/
working_dir: /app/
command: tail -f /dev/null
도커의 Command명령어 자체를 지우면 되지않나?
도커 컨테이너는 detached(-d 옵션) 모드로 실행하면 entrypoint 커맨드를 실행 후,
foreground(background의 반대 개념)에서는 바로 종료되도록 설계되었습니다.
이는 만약 컨테이너 내부의 서버나 서비스가 멈추면 사용자가 원하지 않아도 컨테이너도 함께 종료되는 문제가 발생할 수 있습니다.
→ 즉 서비스가 켜지자 마자 실행중인 프로세스가 없어서 바로 꺼진다
참조