我正在使用以下docker文件构建一个docker Image,基本映像已经安装了tomcat。
#RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:temp1234' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
EXPOSE 22
EXPOSE 80
EXPOSE 443
CMD ["/usr/sbin/sshd", "-D"]
CMD service tomcat7 start && tail -f /var/lib/tomcat7/logs/catalina.out
然而,当我尝试运行此容器时,它失败并出现以下错误
ubuntu@ip-172-16-27-205:~/docker-work$ sudo docker run -p 2222:22 -p 443:443 -p 80:80 d7d7f93692d7
* Starting Tomcat servlet engine tomcat7
...fail!
检查内部容器中已找到的端口是否已被使用。
root@xxxxbd879:/var/log/tomcat7# sudo netstat -plntu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1/sshd
tcp6 0 0 :::1024 :::* LISTEN -
tcp6 0 0 :::44546 :::* LISTEN -
tcp6 0 0 127.0.0.1:8005 :::* LISTEN -
tcp6 0 0 :::47342 :::* LISTEN -
tcp6 0 0 :::80 :::* LISTEN -
tcp6 0 0 :::22 :::* LISTEN 1/sshd
tcp6 0 0 :::443 :::* LISTEN -
我不确定这些端口是如何被占用的。
在容器内部,我无法重启tomcat的服务 它因端口绑定异常而失败。
我想杀死P-ID并启动tomcat服务,但是netstat输出没有给出进程的P-ID。
请建议如何在此容器上启动tomcat服务
答案 0 :(得分:1)
所以问题是由于CMD尝试启动tomcat作为服务(顺便说一下,请注意Dockerfile只运行最后一个CMD,在你的例子中你有两条CMD线)。 无论如何,请尝试添加具有此内容的脚本 run.sh
#!/bin/bash
/etc/init.d/tomcat7 start
exec tail -f /var/lib/tomcat7/logs/catalina.out
并更改您的Dockerfile以复制run.sh并为其授予执行权限。然后更改CMS行以执行run.sh(您可以在其中添加命令以启动sshd)。
COPY run.sh /root/run.sh
RUN chmod +x /root/run.sh
CMD ["/root/run.sh"]