为什么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