我有一个在 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
尽管阅读了无数文章,但似乎仍然无法保持开启状态并关闭。谢谢。
答案1
您的 Dockerfile 中至少有三个错误。
首先,创建 Docker 容器时,您不需要使用 SysVinit、systemd 等来管理进程。实际上,使用它们通常弊大于利。只要进程在前台运行,Docker 守护进程就会保持容器运行。就您而言,您正在调用 SysVinit 脚本,并且该脚本将在守护进程启动后立即退出。您在末尾添加了“&”并不重要:该命令不会在 bash 中运行,因此没有任何区别。只需调用 Tomcat 服务器并使其在前台运行!
第二个问题与 SSH 有关。根据经验,您永远不应在容器内运行 sshd:如果您需要连接到容器内的 shell,请先使用 ssh 连接到主机,然后将自己连接到正在运行的容器 ( docker exec -it container_name bash
)。您的设置也是“错误的”,因为容器应该只运行一个进程。如果您确实需要在容器中使用 SSH 守护程序,那么也有一些“注意事项”:请参阅https://docs.docker.com/engine/examples/running_ssh_service/(但是,我强烈建议您考虑一下是否真的需要在容器内使用 sshd:我想不出您需要这样做的真正原因,除非是因为您需要使用 SSH 隧道连接到进程 - 例如,如果您在容器中运行 VNC 服务器)。
最后,入口点也不正确。您不应该在入口点中调用“bash”:只需指定一个(仅一个!)将要执行的命令。