docker不运行,尽pipe运行在前台和-it选项

我有一个应用程序在Ubuntu容器上使用Apache2 / Tomcat。 它在“/etc/init.d/apatomcat”

这是我的Dockerfile:

这是我在cmd上所做的尝试(包括-D选项与前景等)。

docker开始和附加

docker运行和执行

root@docker:~/tomcat-Docker/ubuntu# cat Dockerfile FROM ubuntu:14.04 ENV http_proxy 'http://wsa.corp.com:8000' ENV https_proxy 'http://wsa.corp.com:8000' ENV DEBIAN_FRONTEND noninteractive ENV apatomcat_DIR=/var/apatomcat/apatomcat/ RUN rm /bin/sh && ln -s /bin/bash /bin/sh COPY apt.conf /etc/apt/apt.conf RUN apt-get -y update RUN apt-get install -y vim python2.7 openjdk-7-jdk ssh ant CMD chmod a+rwx /etc/profile.d/apatomcat.sh COPY apatomcat.conf /etc/apatomcat/apatomcat.conf CMD /etc/init.d/apatomcat start & CMD /etc/init.d/ssh restart & EXPOSE 8080 ENTRYPOINT service ssh restart && bash root@docker9:~/tomcat-Docker/ubuntu# docker build -t apatomcat . docker start 9e1752bf7650 docker attach 9e1752bf7650 root@docker:~/tomcat-Docker/ubuntu# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES root@docker:~/tomcat-Docker/ubuntu# docker run -i -t apatomcat /bin/bash root@docker:~/tomcat-Docker/ubuntu# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 

尽pipe读了无数的文章,但似乎并没有停留在closures。 谢谢。

Dockerfile至less有三个错误。

首先,在创buildDocker容器时,不需要使用SysVinit,systemd等来pipe理进程。 实际上,使用它们通常会造成更多的伤害。 只要进程在前台运行,Docker守护进程将保持容器运行。 在你的情况下,你正在调用一个SysVinit脚本,一旦守护进程启动,脚本就会退出。 不要紧,你在最后加了一个“&”:这个命令不能在bash中运行,所以它没有任何区别。 只需调用Tomcat服务器,并使其在前台运行!

第二个问题是使用SSH。 作为一个经验法则,你不应该在容器中运行sshd:如果你需要连接到容器内的一个shell,首先使用ssh连接到主机,然后把自己附加到一个正在运行的容器( docker exec -it container_name bash ) 。 你的设置也是“错误的”,因为容器应该只运行一个进程而且只运行一个进程。 如果你真的需要在一个容器中的SSH守护进程,也有一些“警告”:请参阅https://docs.docker.com/engine/examples/running_ssh_service/ (但是,我强烈build议您是否真的需要sshd在一个容器中:我想不出一个真正的原因,除非是因为你需要使用SSH隧道连接到一个进程 – 例如,如果你正在容器中运行一个VNC服务器)。

最后,入口点也是不正确的。 你不应该在你的入口点调用“bash”:只要指定一个(而且只是一个!)命令将被执行。