抱歉这个愚蠢的问题,我是 Docker 的初学者。我正在尝试将我的 Java 应用程序部署在官方码头 docker 容器中,一切正常,但是,当我的应用程序尝试将文件写入已安装的卷时,它没有权限,因为目标文件夹属于root用户,但是jetty 作为jetty用户运行。如何启动以 root 身份运行的 jetty 服务器以赋予我的应用程序所需的所有权限?
2 回答
第一种方法
更改您尝试使用的文件夹的所有者
chown jetty:jetty path
第二种方法
将码头添加到 sudoers 以便码头可以访问根文件夹usermod -aG sudo jetty
这两种方法都需要在容器内,因为您没有使用自定义 dockerfile。然后从 docker ps -a 检索您的容器 ID
docker exec -it container_id bash
并尝试上面我建议的 2 种方法来 chown 文件夹。完成后重新启动容器docker restart container_id
如何启动以 root 身份运行的 jetty 服务器以赋予我的应用程序所需的所有权限?
启动容器时指定用户:
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
JETTY_BASE = /var/lib/jetty
TMPDIR = /tmp/jetty
虽然如果您挂载/绑定到该目录,这将起作用,但这看起来像一个黑客,因为这些不是为了存储应用程序数据而设计的。
这里更简洁的方法是自定义图像以在图像上添加旨在存储应用程序数据的文件夹。
这并不难。
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