docker-compose.yaml으로 container 실행 시 Error...is not running 문제
발생한 문제 : “docker-compose로 생성한 container가 not running..”
다음과 같이 docker-compose를 작성하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
services:
humble_ws:
image: humble-ros-env:latest
container_name: humble_ws
privileged: true
network_mode: host
ipc: host
environment:
- DISPLAY=${DISPLAY}
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix:rw
- /dev/video0:/dev/video0
working_dir: /root/ros_ws
# 컨테이너가 시작될 때 자동으로 실행할 명령 (Dockerfile CMD를 오버라이드)
# `docker run`의 `--entrypoint` 또는 CMD와 유사
command: ["bash"]
# 명명된 볼륨 정의 (컨테이너 간 데이터 공유 또는 영구 저장용)
volumes:
humble_ws:
# driver: local # 로컬 파일 시스템 드라이버 (기본값)
# name: custom_humble_ws_volume # 볼륨 이름 명시 (선택 사항)
위와 같이 작성한 docker-compose.yaml을 아래 명령어를 통해 실행
1
$ docker-compose up -d
터미널에 위와 같이 정상적으로 docker-compose.yaml파일에 작성한 container가 Started되었다는 것으 확인할 수 있다.
하지만, 해당 container의 bash 셸에 접속하면 다음과 같은 에러가 발생한다.
1
$ docker exec -it humble_ws /bin/bash
1
Error response from daemon: container 906912b62dedd3328049abbdf485efa249195a65b76d6f62462dd2f5484050ef is not running
발생한 문제 원인: docker-compose.yaml 파일 내의 코드
1
2
3
services:
...
command: ["bash"] # <- 이 부분이 문제가 된다.
docker run 명령어의 옵션으로 주었던 내용이라 저렇게 명시하는 것이 당연하다고 생각했다.
하지만, command: ["bash"]로 설정했을 때 컨테이너가 바로 중단되는 것은 bash 셸이 시작된 후 더 이상 실행할 명령이 없어서 그렇다.
bash 셸은 대화형으로 사용자가 명령을 입력하기를 기다리는데, Docker Compose는 자동으로 입력을 주지 않으므로 bash는 “할 일 다 했다”고 생각하고 바로 종료돼 버린다.
해결 방안: 컨테이너 실행 유지 명령 추가
문제가 되었던 부분을 다음과 같이 수정한다.
1
command: ["/bin/bash", "-c", "tail -f /dev/null"]
전체 yaml 파일은 아래와 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
services:
humble_ws:
image: humble-ros-env:latest
container_name: humble_ws
privileged: true
network_mode: host
ipc: host
environment:
- DISPLAY=${DISPLAY}
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix:rw
- /dev/video0:/dev/video0
working_dir: /root/ros_ws
# 컨테이너가 시작될 때 자동으로 실행할 명령 (Dockerfile CMD를 오버라이드)
# `docker run`의 `--entrypoint` 또는 CMD와 유사
command: ["/bin/bash", "-c", "source /opt/ros/humble/setup.bash && tail -f /dev/null"]
# 명명된 볼륨 정의 (컨테이너 간 데이터 공유 또는 영구 저장용)
volumes:
humble_ws:
# driver: local # 로컬 파일 시스템 드라이버 (기본값)
# name: custom_humble_ws_volume # 볼륨 이름 명시 (선택 사항)
tail -f /dev/null: 이 명령은 /dev/null이라는 특수 파일의 끝을 계속 “따라간다”. /dev/null은 아무것도 출력하지 않는 파일이므로, 이 명령은 CPU 자원을 거의 사용하지 않으면서 컨테이너가 종료되지 않고 계속 실행되도록 유지한다.
"-c"는 다음 인자로 주어지는 문자열을 명령어로 실행하고 셸을 종료한다”**는 의미이다.
만약, "-c"가 없다면 Docker는 이 전체 문자열을 하나의 실행 파일 이름으로 간주하려고 할 것이다.
위와 같이 docker-compose.yaml파일을 수정하였다면, 생성된 docker container의 bash셸에 문제 없이 접속할 수 있을 것이다.
