Why docker container exits immediately | 도커 컨테이너가 즉시 종료되는 문제

Q.

아래 커맨드로 컨테이너를 백그라운드에서 실행했어요.

docker run -d –name hadoop h_Service

컨테이너가 바로 종료돼요. 하지만 포어그라운드에서 실행하면 잘 실행돼요. 아래 커맨드로 로그를 확인했어요.

docker logs hadoop

별다른 에러는 없었어요. 도움 주실 수 있나요?

DOCKERFILE

FROM java_ubuntu_new
RUN wget http://archive.cloudera.com/cdh4/one-click-install/precise/amd64/cdh4-repository_1.0_all.deb
RUN dpkg -i cdh4-repository_1.0_all.deb
RUN curl -s http://archive.cloudera.com/cdh4/ubuntu/precise/amd64/cdh/archive.key | apt-key add –
RUN apt-get update
RUN apt-get install -y hadoop-0.20-conf-pseudo
RUN dpkg -L hadoop-0.20-conf-pseudo
USER hdfs
RUN hdfs namenode -format
USER root
RUN apt-get install -y sudo
ADD . /usr/local/
RUN chmod 777 /usr/local/start-all.sh
CMD [“/usr/local/start-all.sh”]

start-all.sh

#!/usr/bin/env bash
/etc/init.d/hadoop-hdfs-namenode start
/etc/init.d/hadoop-hdfs-datanode start
/etc/init.d/hadoop-hdfs-secondarynamenode start
/etc/init.d/hadoop-0.20-mapreduce-tasktracker start
sudo -u hdfs hadoop fs -chmod 777 /
/etc/init.d/hadoop-0.20-mapreduce-jobtracker start
/bin/bash

 

A1.

도커 컨테이너는 메인 프로세스가 끝날 때 종료돼요.

이 경우에는 start-all.sh 스크립트가 끝날 때 종료될 거에요. 이 경우에 어떻게 해야하는지에 이야기할 수 있을 정도로 제가 하둡에 대해 잘 알지는 않지만, 뭔가 실행되는 것을 포어그라운드에 남겨두거나 runit 또는 supervisord와 같이 프로세스를 실행시켜주는 프로세스 매니저를 사용하면 될 것 같아요.

-d 옵션을 사용하지 않았을 때 잘 돌아갔다고 한 것은 아마도 잘못 이해한 것이 아닌가 싶어요. 똑같은 결과가 나와야 하거든요. 제가 생각하기에는 -d 옵션이 없을 때 약간 다른 커맨드로 실행을 했거나 -it 옵션으로 실행해서 다른 결과가 나온 것 같아요.

간단한 해결 방법은 아래와 같은 내용을 스크립트 끝에 추가하는거에요:

while true; do sleep 1000; done

그런데 이런 방법을 좋아지는 않아요. 스크립트가 프로세스를 계속 지켜봐야 하니까요.

이 코드 출처는 아래와 같아요.

https://github.com/sequenceiq/hadoop-docker/blob/master/bootstrap.sh

 

A2.

아래 커맨드로 하니까 됐어요.

docker run -dit ubuntu

그 후에, 프로세스가 실행 중인 것을 확인합니다.

docker ps -a

컨테이너를 attach합니다.

docker attach CONTAINER_NAME

팁: 컨테이너를 멈추지 않고 종료하려면, ^P^Q를 입력하세요.

-dit는 d, i, t 옵션을 줄인 것이고 각각은 다음과 같아요.

-d, –detach 도커 커맨드를 백그라운드에서 실행합니다.

-i, –interactive Attach되지 않았을 때에도 STDIN을 열어둡니다.

-t, –tty pseudo-TTY를 할당합니다.

 

주석:

저는 파이썬을 연습해볼 독립적인 환경 용도로 컨테이너를 만들고 있었는데요. 그렇다보니 컨테이너가 실행되는 정해진 목적이 딱히 없어 스크립트를 돌릴 필요는 없겠더라구요. 그래서 두 번째 답변대로 해봤더니 잘 됐어요.

 

원문:

https://stackoverflow.com/questions/28212380/why-docker-container-exits-immediately

208 Comments

  1. You could certainly see your expertise in the work you write. The world hopes for even more passionate writers like you who aren’t afraid to say how they believe. Always go after your heart.