繁体   English   中英

Docker Jetty 应用程序无权限写入已安装的卷

[英]Docker Jetty app no permission writing on mounted volume

对于这个愚蠢的问题,我很抱歉,我是 Docker 的新手。我正在尝试在官方码头 docker 容器中部署我的 Java 应用程序,一切正常,但是,当我的应用程序尝试将文件写入已安装的卷时,它没有权限,因为目标文件夹属于root用户,但码头以码头用户身份运行。 如何启动以 root 身份运行的码头服务器,以便为我的应用程序提供所需的所有权限?

第一种方法

使用chown jetty:jetty path更改您尝试处理的文件夹的所有者

第二种方法

将 jetty 添加到 sudoers 以便 jetty 可以使用usermod -aG sudo jetty访问根文件夹

这两种方法都需要在容器内部,因为您没有使用自定义 dockerfile。从 docker 中检索您的容器 ID ps -a 然后

docker exec -it container_id bash

并尝试上面我建议的 2 种方法来 chown 文件夹。 完成后重启容器docker restart container_id

如何启动以 root 身份运行的码头服务器,以便为我的应用程序提供所需的所有权限?

启动容器时指定用户:

docker run -d --user root:root --name jetty -v ... jetty:jdk13

这会起作用,但这不是一个好的做法,因为它给运行容器的用户太多的权利。
默认情况下,大多数图像都是由具有严格要求的权限的应用程序用户启动的,以防止出现这种情况。

我是 Docker 的新手。

初学者或有经验的人,当您想在您不知道的图像上“玩”用户/卷时,经验法则是阅读其文档 如果这还不够,您仍然可以深入了解其 DockerFile。
在文档中,您可以阅读:

默认情况下,此映像以 root 用户身份启动,并使用 Jetty 的 setuid 模块在初始化后将权限降给用户 jetty。 /var/lib/jetty 中的 JETTY_BASE 目录属于 jetty:jetty(uid 999,gid 999)。

事实上,这并不详尽。 Jetty 在容器中使用的所有目录都归 Jetty 所有:

图中默认的 Jetty 环境为:

JETTY_HOME = /usr/local/码头

JETTY_BASE = /var/lib/码头

TMPDIR = /tmp/码头

如果您挂载/绑定到该目录,那将起作用,但这看起来像是一个 hack,因为它们不是为存储应用程序数据而设计的。
这里更简洁的方法是自定义图像以在图像上添加一个旨在存储应用程序数据的文件夹。
那并不难。

1)为自定义码头图像创建一个DockerFile
例如my-jetty-DockerFile

FROM jetty:jdk13
VOLUME my-app-data
RUN mkdir my-app-data
RUN chown jetty:jetty my-app-data

2)构建该图像:

docker build -t jetty-with-data-vol:jdk13 -f my-jetty-DockerFile . 

3) 使用已安装的卷启动该图像的容器:

docker run -d  --name my-jetty -v jetty-vol:/my-app-data jetty-with-data-vol:jdk13 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM