Docker Tomcat用户配置无法正常工作

14

更新:清理并直接指出问题和解决方案。

问题:

已正确安装和运行Docker-tomcat,但在管理器应用程序中遇到403访问错误。同时,我的Docker Tomcat似乎无法找到我的tomcat-users.xml配置文件。

解决方案:

感谢FarhadSanket提供的答案。

[文件]:

Dockerfile

FROM tomcat:8.5.11
MAINTAINER Borgy Manotoy <borgymanotoy@ujeaze.com>

# Update Apt and then install Nano editor (RUN can be removed)
RUN apt-get update && apt-get install -y \
    nano \
&& mkdir -p /usr/local/tomcat/conf

# Copy configurations (Tomcat users, Manager app)
COPY tomcat-users.xml /usr/local/tomcat/conf/
COPY context.xml /usr/local/tomcat/webapps/manager/META-INF/

Tomcat用户配置(conf/tomcat-users.xml)
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">
    <role rolename="manager-gui"/>
    <role rolename="manager-script"/>
    <user username="admin" password="password" roles="manager-gui,manager-script" />
</tomcat-users>

应用程序上下文(webapps/manager/META-INF/context.xml)

<?xml version="1.0" encoding="UTF-8"?>
<Context antiResourceLocking="false" privileged="true" >
  <!--
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
  -->
</Context>

[步骤和命令]:

  1. 构建 Docker 镜像

    docker build -t borgymanotoy/my-tomcat-docker .

  2. 运行镜像 (my-tomcat-docker 并将端口设置为 8088)

    docker run --name my-tomcat-docker-container -p 8088:8080 -it -d borgymanotoy/my-tomcat-docker

  3. 进入容器的 bash (通过 bash 检查容器内的文件)

    docker exec -it biyahe-tomcat-docker-container bash

3个回答

17

首先,您需要将应用程序暴露在容器中,这样您就可以从docker主机/网络连接到它。

docker run -d -p 8000:8080 tomcat:8.5.11-jre8
你需要更改两个文件才能从远程主机访问管理程序。 (Docker主机上的浏览器被认为是远程的,仅在容器回环接口接收到的数据包被认为是tomcat本地的)
1. /usr/local/tomcat/webapps/manager/META-INF/context.xml 注意被注释的部分。
<Context antiResourceLocking="false" privileged="true" >
<!--
     <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->

请注意注释部分。

  1. /usr/local/tomcat/conf/tomcat-users.xml 正如您在问题中所述。

<tomcat-users xmlns="http://tomcat.apache.org/xml"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
          version="1.0">
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="admin" password="password" roles="manager-gui,manager-script" />

为了更改容器中的文件,您可以尝试构建自己的镜像,但我建议使用Docker卷或绑定挂载。

也请确保重新启动容器以使更改生效。


可以为我工作,但您必须重新启动带有Tomcat服务器的Docker容器。 - RazvanParautiu

2
请在执行docker run命令时指定端口(我相信mine/tomcat-version是您的镜像名称),例如: docker run -p 8000:8080 -it -d --name MyContainerName mine/tomcat-version 然后使用以下方式访问管理页面:
http://<ipaddress>:8000/manager/html

要在Docker中获取主机IP地址,需要执行docker-machine ip命令。
附加信息:如果您想要检查不同的内容,如Tomcat日志、配置文件等,可以使用以下命令进入容器:docker exec -it MyContainerName bash

我忘记指定端口为8088并为容器分配名称。感谢 'docker exec...' 我需要在容器内工作。 - Borgy Manotoy
403错误,似乎没有看到我在tomcat-users.xml中的更改,尽管已经应用了。我需要按照Farhad在#1中的答案修改context.xml,现在它可以工作了 :) 谢谢大家! - Borgy Manotoy

0

虽然有点晚了,但我还是想留下我的意见。

我通过构建一个示例持续集成系统,将这个解决方案提升到了一个新的水平。只需在项目IDE中运行mvn clean install,同时保持docker tomcat容器运行,即可将war包部署到docker tomcat中。

  • 这解决了每次有新的构建可用时必须重新启动tomcat容器的问题。利用了tomcat的自动部署功能
  • 使用共享卷,以便将多个war部署到共享卷中,然后脚本会获取您的war并将其部署到tomcat webapps中
  • 附带一个标准用户'admin',以便访问管理GUI。
  • 可在公共docker仓库上使用:docker run -p 8080:8080 -d --name tom -v <YOUR_VOLUME>:/usr/local/stagingwebapps wintersoldier/tomcat_ci:1.0
  • 获取放置在共享卷中的任何war文件,并立即将它们部署到tomcat服务器,还可以通过GUI部署它们
  • 这里是一个示例应用程序,包括所需的maven更改和docker文件供探索

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接