我正在尝试将文件添加到从官方tomcat
镜像构建的 Docker 镜像中。该镜像似乎没有 root 权限,因为tomcat
如果我运行 bash,我会以用户身份登录:
docker run -it tomcat /bin/bash
tomcat@06359f7cc4db:/usr/local/tomcat$
如果我指示 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 .
输出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
答案1
可能有一种方法可以查看和更改 tomcat 的 Dockerfile,但我花了几分钟才弄清楚。我的不优雅的解决方案是在 chown 之前添加此行:
USER root
如果您想要降低权限(建议这样做),您可以添加以下行:
USER tomcat
或者,使用未安装任何软件的映像,这样您就可以以 root 身份启动 Dockerfile 并安装 tomcat 等。根据我的经验,他们在映像中更改这一点实际上很奇怪。允许目标最终用户根据自己的意愿设置 USER 指令是有意义的。
答案2
从 Docker 17.09 开始,可以使用--chown
Dockerfile 中 ADD/COPY 操作上的标志在 ADD/COPY 步骤本身中更改所有者,而不是使用 chown 进行单独的 RUN 操作,这会增加图像的大小(如您所说)。将此作为默认模式会很好,即将复制文件的用户的权限应用于复制的文件。但是,Docker 团队不想破坏向后兼容性,因此引入了一个新标志。
COPY --chown=<user>:<group> <hostPath> <containerPath>
其他选择包括:
- 在构建图像之前更改暂存文件夹中的权限。
- 通过改变所有权的引导脚本运行容器。
- 压扁各层!