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

 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

当前回答

把这个添加到Dockerfile的末尾:

CMD tail -f /dev/null

示例Docker文件:

FROM ubuntu:16.04

# other commands

CMD tail -f /dev/null

参考

其他回答

添加

exec "$@"

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

当主进程结束时,docker容器退出。

在这种情况下,它将在start-all.sh脚本结束时退出。我对hadoop的了解还不够多,无法告诉您在这种情况下如何做到这一点,但是您需要在前台运行一些东西,或者使用进程管理器(如runit或supervisor ord)来运行进程。

我认为如果你没有指定-d,你一定是弄错了;效果应该是一样的。我怀疑你用了一个稍微不同的命令启动了它,或者使用了-it,这会改变一些事情。

一个简单的解决方法就是添加如下内容:

而真正的;做睡眠1000;完成

到剧本的结尾。然而,我不喜欢这样,因为脚本实际上应该监视它启动的进程。

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

这对我来说很管用:

docker run -dit ubuntu

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

docker ps -a

用于再次附加容器

docker attach CONTAINER_NAME

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

一个很好的方法是启动你的进程和服务,在后台运行它们,并使用等待[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