debian中的Tomcat7:wheezy Docker实例无法启动

debian中的Tomcat7:wheezy Docker实例无法启动,debian,tomcat7,docker,boot2docker,Debian,Tomcat7,Docker,Boot2docker,我第一次尝试使用来自Google的debian图像(Google/debian:wheezy)构建docker图像,在其上设置OpenJDK7并尝试设置Tomcat7 docker pull google/debian:wheezy docker run -i -t google/debian:wheezy bash 一旦我进入bash,我就用 apt-get update apt-get install openjdk-7-jre 过了一会儿,我遇到了一个错误,我必须运行 apt-get

我第一次尝试使用来自Google的debian图像(Google/debian:wheezy)构建docker图像,在其上设置OpenJDK7并尝试设置Tomcat7

docker pull google/debian:wheezy
docker run -i -t google/debian:wheezy bash
一旦我进入bash,我就用

apt-get update
apt-get install openjdk-7-jre
过了一会儿,我遇到了一个错误,我必须运行

 apt-get update --fix-missing
 apt-get install openjdk-7-jre
 apt-get install tomcat7
安装Tomcat7后,我尝试使用

/etc/init.d/tomcat7 start
这给了我以下错误:

[FAIL] Starting Tomcat servlet engine: tomcat7 failed!
我显然做错了什么,我在我的Debian Docker安装和我的OSX Docker安装上得到了完全相同的行为(至少它是一致的,这有点令人印象深刻!)

查看/var/log/catalina.out不会显示任何错误,localhost日志也不会显示任何错误

我对一个正常的debian使用了相同的过程:喘息图像,得到完全相同的失败,没有任何错误。
你知道我把事情搞砸了吗?

我建议你从一个新的角度树立自己的形象。这是一种更加明确、一致和可维护的方式,如果在构建过程中出现一些错误,docker将输出错误

例如,Dockerfile的开头是:

FROM google/debian:wheezy
MAINTAINER Jan Vladimir Mostert <JanVladimirMostert@example.com>
RUN apt-get -qq update
RUN apt-get install openjdk-7-jre
RUN apt-get install tomcat7
来自谷歌/debian的
:喘息
维修员扬·弗拉基米尔·莫斯特
运行apt-get-qq更新
运行apt-get安装openjdk-7-jre
运行apt-get-install-tomcat7

因此,您可以在Dockerfile中启动tomcat。

我尝试了您的步骤,并且能够很好地运行tomcat。我没有发现apt-get的问题,所以现在需要
apt-get-update--fix-missing
。我甚至从init.d脚本中启动了tomcat,它成功了

我的猜测是,要么你有一些网络问题,要么Debian的存储库有一些问题,但它们得到了修复

在任何情况下,您都应该注意,只要指定的命令正在运行,容器就一直在运行。这意味着,您要么在前台运行tomcat,要么以另一种方式确保相同的内容。您可以查看一些选项

[编辑]

我创建了一个
Dockerfile
来测试这一点。这是:

FROM google/debian:wheezy

RUN apt-get update
RUN apt-get install -y openjdk-7-jre tomcat7

ADD run.sh /root/run.sh
RUN chmod +x /root/run.sh

EXPOSE 8080

CMD ["/root/run.sh"]
下面是它使用的
run.sh
脚本:

#!/bin/bash

/etc/init.d/tomcat7 start

# The container will run as long as the script is running, that's why
# we need something long-lived here
exec tail -f /var/log/tomcat7/catalina.out
以下是生成和运行会话的示例:

$ docker build -t tomcat7-test .
$ docker run -d -p 8080:8080 tomcat7-test

现在您应该可以在
http://localhost:8080/

您可以在docker文件中使用服务tomcat start,只需使用docker run命令添加--privileged=true参数即可。Tomcat需要扩展权限

请务必了解此标志的安全含义。
这里有更多信息:

在Ubuntu下:Trusty下面的docker运行选项解决了tomcat启动(实际启动停止守护进程)的问题


尝试直接启动它,而不是使用init.d脚本,看看会发生什么。我没有试过谷歌图片,但是官方的ubuntu图片似乎不能很好地处理init.d脚本。@ivant,我创建了一个新的图片并手动下载了tomcat____;.tar.gz,对于tomcat7和tomcat8,我只运行bin/catalina.sh start,它就启动得很好。因此,问题似乎出在Debian的init脚本上。您的评论是目前为止最好的答案,请作为答案发布,以便我可以接受。@Pak,好的建议,但它本身并不能解决问题。事实上,我的工作流程是开始以交互方式构建图像,并在Dockerfile中添加命令,当我看到它们做了正确的事情时。google/debian:wheezy做了一个干净的拉动,我不再得到--修复丢失的问题,但tomcat仍然没有启动(如果我手动下载它并执行catalina.sh start,这很好)。明天将重试。使用dockerfiles,它工作得完美无瑕,我花了一段时间才发现我需要在docker build命令的末尾添加一个“.”(或./),我认为dot只是我屏幕上的一个灰尘规范:p
docker run -itd --cap-add=SYS_PTRACE --security-opt=apparmor:unconfined mytomcat7image