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
抱歉这个愚蠢的问题,我是 Docker 的新手。我正在尝试在官方码头 docker 容器中部署我的 Java 应用程序,一切正常,但是,当我的应用程序尝试将文件写入已安装的卷时,它没有权限,因为目的地文件夹属于 root 用户,但码头是 运行 作为 jetty 用户。我怎样才能以 root 身份启动码头服务器 运行 来为我的应用程序提供它需要的所有权限?
第一种方法
更改您尝试处理的文件夹的所有者
chown jetty:jetty path
第二步
将 jetty 添加到 sudoers 以便 jetty 可以使用 usermod -aG sudo jetty
这两种方法都需要在容器内,因为您没有使用自定义 docker 文件。 从 docker ps -a then
检索您的容器 IDdocker 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