如何将文件添加到没有root权限的docker容器?

nyi*_*nyi 19 containers file-permissions docker

我正在尝试将文件添加到从官方tomcat镜像构建的 Docker镜像中。该图像似乎没有 root 权限,因为tomcat如果我运行 bash ,我以用户身份登录:

docker run -it tomcat /bin/bash
tomcat@06359f7cc4db:/usr/local/tomcat$ 
Run Code Online (Sandbox Code Playgroud)

如果我指示 aDockerfile将文件复制到该容器,则该文件具有权限644并且所有者为root. 据我了解,这似乎是合理的,因为 Dockerfile 中的所有命令都以 root 身份运行。但是,如果我尝试将该文件的所有权更改为 ,则会tomcat:tomcat出现Operation not permitted错误。

为什么我不能更改复制到该图像的文件的权限?

如何复制:

mkdir docker-addfilepermission
cd docker-addfilepermission
touch test.txt
echo 'FROM tomcat
COPY test.txt /usr/local/tomcat/webapps/
RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt' > Dockerfile

docker build .
Run Code Online (Sandbox Code Playgroud)

的输出docker build .

Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon 
Step 0 : FROM tomcat
 ---> 44859847ef64
Step 1 : COPY test.txt /usr/local/tomcat/webapps/
 ---> Using cache
 ---> a2ccb92480a4
Step 2 : RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt
 ---> Running in 208e7ff0ec8f
chown: changing ownership of '/usr/local/tomcat/webapps/test.txt': Operation not permitted
2014/11/01 00:30:33 The command [/bin/sh -c chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt] returned a non-zero code: 1
Run Code Online (Sandbox Code Playgroud)

小智 26

可能有一种方法可以查看和更改 tomcat 的 Dockerfile,但几分钟后我无法弄清楚。我不雅的解决方案是在 chown 之前添加这一行:

USER root

如果您想在(推荐)之后降低权限,您可以添加以下行:

USER tomcat

或者,使用一个没有安装软件的镜像,这样你就可以以 root 身份开始你的 Dockerfile 并安装 tomcat 等等。根据我的经验,他们改变了他们的形象,这实际上很奇怪。允许预期的最终用户按照他们认为合适的方式设置 USER 指令是有意义的。


小智 15

从 Docker 17.09 开始,可以使用--chownDockerfile 中的 ADD/COPY 操作上的标志来更改 ADD/COPY 步骤本身中的所有者,而不是使用 chown 进行单独的 RUN 操作,这会增加图像的大小,正如您所指出的。将此作为默认模式会很好,即将复制文件的用户的权限应用于复制的文件。但是,Docker 团队不想破坏向后兼容性,因此引入了一个新标志。

COPY --chown=<user>:<group> <hostPath> <containerPath>
Run Code Online (Sandbox Code Playgroud)

其他选择是:

  1. 在构建映像之前更改暂存文件夹中的权限。
  2. 通过更改所有权的引导脚本运行容器。
  3. 压扁层!