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

Docker Jetty app no permission writing on mounted volume

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

第一种方法

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

第二步

将 jetty 添加到 sudoers 以便 jetty 可以使用 usermod -aG sudo jetty

访问根文件夹

这两种方法都需要在容器内,因为您没有使用自定义 docker 文件。 从 docker ps -a then

检索您的容器 ID
docker exec -it container_id bash

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

重启容器

How can I start the jetty server running as root to give my application all the permissions it needs?

启动容器时指定用户:

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

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

I'm very beginner with Docker.

无论是初学者还是老手,当您想在一张您不认识的图像上 "play" 和 user/volumes 时,经验法则就是阅读其 documentation。如果这还不够,您仍然可以深入研究它的 DockerFile。
在文档中,您可以阅读:

By default, this image starts as user root and uses Jetty's setuid module to drop privileges to user jetty after initialization. The JETTY_BASE directory at /var/lib/jetty is owned by jetty:jetty (uid 999, gid 999).

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

The default Jetty environment in the image is:

JETTY_HOME = /usr/local/jetty

JETTY_BASE = /var/lib/jetty

TMPDIR = /tmp/jetty

虽然如果您 mount/bind 到那个目录,那将起作用,但这看起来像 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