无法在 docker 中启动 tomcat:“权限被拒绝”

Posted

技术标签:

【中文标题】无法在 docker 中启动 tomcat:“权限被拒绝”【英文标题】:Can't start tomcat within docker: "Permission denied" 【发布时间】:2018-02-14 00:15:27 【问题描述】:

我有以下 docker 文件:

FROM debian:jessie
RUN apt-get update && apt-get install -y wget

RUN wget --quiet http://www.us.apache.org/dist/tomcat/tomcat-8/v8.5.20/bin/apache-tomcat-8.5.20.tar.gz -O /tmp/tomcat.tar.gz
RUN cd /tmp && tar xf tomcat.tar.gz
RUN mv /tmp/apache-tomcat-8.5.20 /usr/share/
RUN adduser --system --shell /bin/bash --gecos 'Tomcat Java Servlet and JSP engine' --group --disabled-password --home /home/tomcat tomcat
RUN chown -R tomcat:tomcat /usr/share/apache-tomcat-8.5.20/*
RUN chmod +x /usr/share/apache-tomcat-8.5.20/bin/*.sh

RUN apt-get update && apt-get install -y openjdk-7-jre-headless

CMD ["/bin/bash"]

如果我在笔记本电脑上使用 Ubuntu 17.04 和 docker 1.12.6 编译,构建 78d1802,我可以执行

su tomcat -c /usr/share/apache-tomcat-8.5.20/bin/startup.sh

没有任何问题:

$ sudo docker run -it ff1323fadc66
root@728de06f43be:/# su tomcat -c /usr/share/apache-tomcat-8.5.20/bin/startup.sh
Using CATALINA_BASE:   /usr/share/apache-tomcat-8.5.20
Using CATALINA_HOME:   /usr/share/apache-tomcat-8.5.20
Using CATALINA_TMPDIR: /usr/share/apache-tomcat-8.5.20/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/share/apache-tomcat-8.5.20/bin/bootstrap.jar:/usr/share/apache-tomcat-8.5.20/bin/tomcat-juli.jar
Tomcat started.

但是,如果我在 Ubuntu 16.04 LTS 和 docker 1.12.6 上尝试相同的操作,构建 78d1802,它托管在 AWS 上,我会得到以下输出:

$ sudo docker run -it 96e0e82a9dda
root@f8f7d3fd6917:/# su tomcat -c /usr/share/apache-tomcat-8.5.20/bin/startup.sh
Using CATALINA_BASE:   /usr/share/apache-tomcat-8.5.20
Using CATALINA_HOME:   /usr/share/apache-tomcat-8.5.20
Using CATALINA_TMPDIR: /usr/share/apache-tomcat-8.5.20/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/share/apache-tomcat-8.5.20/bin/bootstrap.jar:/usr/share/apache-tomcat-8.5.20/bin/tomcat-juli.jar
touch: cannot touch '/usr/share/apache-tomcat-8.5.20/logs/catalina.out': Permission denied
/usr/share/apache-tomcat-8.5.20/bin/catalina.sh: 434: /usr/share/apache-tomcat-8.5.20/bin/catalina.sh: cannot create /usr/share/apache-tomcat-8.5.20/logs/catalina.out: Permission denied

这怎么可能? docker文件不应该产生相同的环境吗?我还在 MacOS 上尝试过它,它也可以在那里启动 tomcat。

我已经尝试使用chmod 777 /usr/share/apache-tomcat-8.5.20/logs/ 来规避这个问题,但也没有用。

编辑:

根据要求输出ls -alh /usr/share/apache-tomcat-8.5.20/logs/

root@ce87bb8feb9b:/# su tomcat -c /usr/share/apache-tomcat-8.5.20/bin/startup.sh
Using CATALINA_BASE:   /usr/share/apache-tomcat-8.5.20
Using CATALINA_HOME:   /usr/share/apache-tomcat-8.5.20
Using CATALINA_TMPDIR: /usr/share/apache-tomcat-8.5.20/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/share/apache-tomcat-8.5.20/bin/bootstrap.jar:/usr/share/apache-tomcat-8.5.20/bin/tomcat-juli.jar
touch: cannot touch '/usr/share/apache-tomcat-8.5.20/logs/catalina.out': Permission denied
/usr/share/apache-tomcat-8.5.20/bin/catalina.sh: 434: /usr/share/apache-tomcat-8.5.20/bin/catalina.sh: cannot create /usr/share/apache-tomcat-8.5.20/logs/catalina.out: Permission denied
root@ce87bb8feb9b:/# ls -alh /usr/share/apache-tomcat-8.5.20/logs/
total 8.0K
drwxr-x---  2 tomcat tomcat 4.0K Aug  2 21:35 .
drwxr-xr-x 17 root   root   4.0K Sep  6 06:58 ..
root@ce87bb8feb9b:/# 

另外:当然也可以不切换用户启动tomcat,然后使用root,但我宁愿避免这种情况。

编辑2:

主机是 Ubuntu 16.04.3 LTS:

$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="16.04.3 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.3 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

它还有一个开发日志:

$ ls -l /run/systemd/journal/dev-log 
srw-rw-rw- 1 root root 0 Sep  5 13:13 /run/systemd/journal/dev-log

【问题讨论】:

试试chmod -R 777 /usr/share/apache-tomcat-8.5.20/logs/ 我也这样做了,但我没有工作。无论如何编译图像后目录为空。 尝试使用 upstart 命令启动它:service tomcat start/etc/init.d/tomcat 脚本 或者试试chown -R tomcat:tomcat /usr/share/apache-tomcat-8.5.20/logs/ 可以升级docker到最新版本试试吗? 【参考方案1】:

1.Exec 容器: docker exec -it <CONTAINER ID> bash

2.安装和使用 nano、vim 或其他编辑器;

3.编辑

3.1. 根据: https://tomcat.apache.org/tomcat-8.0-doc/manager-howto.html

/conf/tomcat-users.xml

/webapps/host-manager/manager.xml

3.2 /webapps/manager/META-INF/context.xml comment lines <!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> -->

然后重启你的docker镜像或者:

./shutdown.sh
./startup.sh 

您可以尝试在 /webapps/manager/META-INF/context.xml 中指定其他 IP 以允许它们

警告:这是我的测试设置,不适用于商业解决方案!

【讨论】:

【参考方案2】:

我不禁想知道为什么要重新发明***,官方的 tomcat 图像有什么问题? https://docs.docker.com/samples/library/tomcat/ 或 https://hub.docker.com/_/tomcat/

https://***.com/a/29297790/6785908

【讨论】:

因为这只是更大图像的一部分,其中包含 Apache 2.4、php 7.0、Postgresql 9.6、PostGIS 2.3、Tomcat 8.5、Geoserver 2.2、Laravel。我没有找到包含所有这些的图像。【参考方案3】:

所以这个似乎是最奇怪的一个,我不确定这不起作用的根本情况,但下面的选项对你有用

将用户更改为 tomcat,然后提取文件夹

FROM debian:jessie
RUN apt-get update && apt-get install -y wget openjdk-7-jre-headless

RUN adduser --system --shell /bin/bash --gecos 'Tomcat Java Servlet and JSP engine' --group --disabled-password --home /home/tomcat tomcat
USER tomcat
RUN wget --quiet http://www.us.apache.org/dist/tomcat/tomcat-8/v8.5.20/bin/apache-tomcat-8.5.20.tar.gz -O /tmp/tomcat.tar.gz && cd /tmp && tar xf tomcat.tar.gz && mv /tmp/apache-tomcat-8.5.20/ /tomcat
USER root
CMD ["/bin/bash"]

删除日志文件夹并重新创建

FROM debian:jessie
RUN apt-get update && apt-get install -y wget openjdk-7-jre-headless

RUN adduser --system --shell /bin/bash --gecos 'Tomcat Java Servlet and JSP engine' --group --disabled-password --home /home/tomcat tomcat
RUN wget --quiet http://www.us.apache.org/dist/tomcat/tomcat-8/v8.5.20/bin/apache-tomcat-8.5.20.tar.gz -O /tmp/tomcat.tar.gz && cd /tmp && tar xf tomcat.tar.gz && mv /tmp/apache-tomcat-8.5.20/ /tomcat
RUN rm -rf /tomcat/logs && chown -R tomcat:tomcat /tomcat && su tomcat -c "mkdir /tomcat/logs"
CMD ["/bin/bash"]

以上解决方案适用于您的情况。两个操作系统中行为不同的根本原因尚不清楚

为任何有兴趣调试的人粘贴 bin

strace su tomcat -c /tomcat/logs/text.txt

https://pastebin.com/vVBEXJQ1

实际使用的最终 dockerfile

https://pastebin.com/H5AVt9P5

【讨论】:

以上是关于无法在 docker 中启动 tomcat:“权限被拒绝”的主要内容,如果未能解决你的问题,请参考以下文章

docker环境hosts配置错误导致的tomcat无法正常启动

docker jetty10 启动 war

Docker 使用 tomcat镜像部署web网站无法访问

记录Tomcat8.5文件上传,文件权限无法访问

Tomcat可以启动但是无法访问localhost:8080

docker postgres 无法更改 pgdata 权限