我运行一个容器在后台使用

 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容器立即退出?

如果你想强制映像挂起(为了调试某些东西或检查文件系统的状态),你可以重写入口点,将其更改为shell:

docker run -it --entrypoint=/bin/bash myimagename

其他回答

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

一个很好的方法是启动你的进程和服务,在后台运行它们,并使用等待[n…]命令。在bash中,wait命令强制当前进程:

等待每个指定的进程并返回其终止状态。如果不指定n,则等待所有当前活动的子进程,并且返回状态为0。

我从Sébastien Pujadas的开始脚本为他的麋鹿构建得到这个想法。

从最初的问题来看,你的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

您需要使用-d标志来运行它,以使它在后台作为守护进程运行。

Docker运行-d -it ubuntu bash

由于映像是linux,因此要检查的一件事是确保容器中使用的任何shell脚本都有unix行结束符。如果它们的末尾有^M,那么它们就是窗口行结束符。修复它们的一种方法是在/usr/local/start-all.sh上使用dos2unix将它们从windows转换为unix。以交互模式运行docker可以帮助解决其他问题。可能是文件名打错了。参见https://en.wikipedia.org/wiki/Newline

例如,如果您从容器中检查Dockerfile fballiano / magento2-apache-php

你会看到他在文件末尾添加了以下命令: 而真正的;做睡眠1;完成

现在,我建议你这样做

docker container ls --all | grep 127

然后,您将看到您的docker映像是否有一个错误,如果它以0退出,那么它可能需要这些将永远休眠的命令之一。