我正在尝试运行一个安装了我的Web应用程序的简单docker容器(不使用docker文件)。 在测试期间,我总是使用-t -i选项运行容器,然后通过运行shell脚本启动其中的tomcat服务。 当我转向生产时,我不想再使用-t -i选项,只需要我的Tomcat服务启动并成为唯一的主要服务。
我尝试将入口点指向启动脚本以启动tomcat,但容器在该脚本完成后终止。 如何运行容器,启动服务并将该服务保留为容器的单个主要服务?
注意:我读了一些关于主管的帖子,但不确定如果我走这条路,是否需要从头开始构建我的图像?我宁愿不这样做。
有什么建议吗?
答案 0 :(得分:11)
如果你有一个使用入口点模式的Dockerfile,它将如下所示:
(Dockerfile)
FROM ubuntu
...Some configuration steps...
add start.sh /start.sh
ENTRYPOINT ["/start.sh"]
您需要做的就是确保start.sh
脚本已挂起'某种程度上来说。有些人喜欢拖尾系统日志,但拖尾任何存在的文件都会有效。
(start.sh)
#!/bin/bash
service Your_Service_Or_Whatever start
tail -f /var/log/dmesg
答案 1 :(得分:2)
较短的版本:
FROM ubuntu
...Some configuration steps...
ENTRYPOINT ["/bin/sh", "-c", "while true; do sleep 1; done"]
使用Docker版本1.12.1进行测试,构建23cf638
使用docker --version
查找您的版本
答案 2 :(得分:1)
默认情况下,Docker容器将根据映像Dockerfile
中的配置运行。如果您通常运行带有-i
标志的容器,则将STDIN保持打开状态,允许您访问容器入口点,或者它可以是bash shell。为了实现您的目标,您可以在分离状态下运行容器,将命令直接传递给docker run。
docker run -d myapp /opt/catalina/bin/startup.sh
这将使myapp容器处于分离状态,并将运行作为第3个参数传递的命令。如果命令导致长期服务,则只要服务是,容器就会保持活动状态。