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


16

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

docker run -it tomcat /bin/bash
tomcat@06359f7cc4db:/usr/local/tomcat$ 

如果我指示Dockerfile将文件复制到该容器,则该文件具有权限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

Answers:


20

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

USER root

如果要在之后取消提升特权(建议),则可以添加以下行:

USER tomcat

或者,使用未安装软件的映像,因此您可以以root身份启动Dockerfile并安装tomcat和所有其他程序。实际上,根据我的经验,他们改变了自己的形象,这很奇怪。允许目标最终用户设置他们认为合适的USER指令是有意义的。


这确实有效!您是否偶然知道为什么ADD和COPY命令使用所有者创建文件root?他们为什么不考虑USER指令?
nyi 2014年

1
好吧,通常您看不到设置指令的基本映像,因为没有真正的方法知道系统上将有哪些用户帐户。仅将文件创建为根目录也可能会更容易,因为这就是Docker必须运行的方式。看起来这是一个合理的增强请求,如果可以由USER指令中设置的内容自动拥有东西,它将简化构建Dockerfile的过程。
theterribletrivium

谢谢。真的让我摆脱了痛苦。我需要在Jenkins图像中添加ssh键。
Kostas Demiris

8

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

COPY --chown=<user>:<group> <hostPath> <containerPath>

其他替代方法是:

  1. 在生成映像之前,请在临时文件夹中更改权限。
  2. 通过更改所有权的引导脚本运行容器。
  3. 挤压层!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.