为什么docker集装箱立即退出

我使用后台运行一个容器

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 

docker容器在其主进程完成时退出。

在这种情况下,当你的start-all.sh脚本结束时,它将会退出。 我不太了解hadoop在这种情况下告诉你怎么做,但是你需要在前台运行一些东西,或者使用诸如runit或supervisord之类的进程pipe理器来运行这些进程。

我认为如果你不指定-d ,你一定会误解它的工作。 它应该有完全一样的效果。 我怀疑你是用一个稍微不同的命令启动它,或者用-it来改变事情。

一个简单的解决scheme可能是添加如下内容:

while true; do sleep 1000; done

到脚本的末尾。 然而,我不喜欢这个,因为脚本应该真正监视它启动的过程。

(我应该说我偷了从https://github.com/sequenceiq/hadoop-docker/blob/master/bootstrap.sh代码);

这为我做了诡计:

 docker run -dit ubuntu 

之后,我可以看到正在运行的进程:

 docker ps -a 

重新安装容器

 docker attach CONTAINER_NAME 

提示:在不停止容器types的情况下退出: ^P^Q

我想扩大或者敢于说,改进camposer提到的答案

当你跑步

 docker run -dit ubuntu 

您基本上是以交互模式在后台运行容器。

当你通过CTRL + D(最常见的方法)连接和退出容器时,你停止了容器,因为你刚刚使用上面的命令杀死了你启动容器的主进程。

利用一个已经运行的容器,我只需要fork另一个进程就可以运行:

 docker exec -it <container ID> /bin/bash 

一个不错的方法是启动在后台运行它们的进程和服务,并在脚本结尾处使用wait [n ...]命令。 在bash中,wait命令强制当前进程:

等待每个指定的进程并返回其终止状态。 如果没有给出n,则等待所有当前活动的subprocess,并且返回状态为零。

我从SébastienPujadas 为他的麋鹿build立起的脚本中得到了这个想法。

从原来的问题,你是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 & wait 

我的实践是在Dockerfile中启动一个不会立即退出CMD [ "sh", "-c", "service ssh start; bash"] docker run -dit image_name ,然后docker run -dit image_name 。 这样(ssh)服务和容器运行起来。

每当我想完成脚本执行后,我想添加一个容器

 && tail -f /dev/null 

在命令结束时。 所以它应该是:

 /usr/local/start-all.sh && tail -f /dev/null 

由于映像是一个Linux,所以要检查的一件事是确保容器中使用的任何shell脚本都具有unix行结束符。 如果他们在最后有一个^ M,那么他们是窗口行尾。 解决这些问题的方法之一是使用/usr/local/start-all.sh上的dos2unix将它们从Windows转换为unix。 以交互模式运行docker工具可以帮助您找出其他问题。 你可能有一个文件名错别字或什么的。 请参阅https://en.wikipedia.org/wiki/Newline