도커 컨테이너 실행 유지 방법 ( tail -f /dev/null )

도커


나의 문제 상황

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의 반대 개념)에서는 바로 종료되도록 설계되었습니다.

이는 만약 컨테이너 내부의 서버나 서비스가 멈추면 사용자가 원하지 않아도 컨테이너도 함께 종료되는 문제가 발생할 수 있습니다.

즉 서비스가 켜지자 마자 실행중인 프로세스가 없어서 바로 꺼진다



참조

도커 컨테이너 실행유지 방법 및 /dev/null 설명

Dec 26, 2023 Views 668