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

 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 run -dit ubuntu

之后,我检查了运行的进程使用:

docker ps -a

用于再次附加容器

docker attach CONTAINER_NAME

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

其他回答

为什么docker容器立即退出?

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

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

这对我来说很管用:

docker run -dit ubuntu

之后,我检查了运行的进程使用:

docker ps -a

用于再次附加容器

docker attach CONTAINER_NAME

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

添加

exec "$@"

在我的shell脚本的末尾是我的修复!

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

当你奔跑

docker run -dit ubuntu

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

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

利用一个已经运行的容器,我只需要fork bash的另一个进程,并通过运行来获得一个伪TTY:

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

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

&& tail -f /dev/null

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

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