如何在Docker容器内设置文件夹权限

70

我正在 Dockerfile 中创建一个文件夹,并且想要给它写入权限。但是当我尝试这样做时,会出现权限被拒绝的错误。

FROM python:2.7
RUN pip install Flask==0.11.1 
RUN useradd -ms /bin/bash admin
USER admin
COPY app /app
WORKDIR /app
RUN chmod 777 /app
CMD ["python", "app.py"] 

我的错误是

PS C:\Users\Shivanand\Documents\Notes\Praneeth's work\Flask> docker build -t 
shivanand3939/test .
Sending build context to Docker daemon  209.9kB
Step 1/8 : FROM python:2.7
---> 8a90a66b719a
Step 2/8 : RUN pip install Flask==0.11.1
---> Using cache
---> 6dc114bd7cf1
Step 3/8 : RUN useradd -ms /bin/bash admin
---> Using cache
---> 1cfdb6eea7dc
Step 4/8 : USER admin
---> Using cache
---> 27c5e8b09f15
Step 5/8 : COPY app /app
---> Using cache
---> 5d628573b24f
Step 6/8 : WORKDIR /app
---> Using cache
---> 351e19a5a007
Step 7/8 : RUN chmod 777 /app
---> Running in aaad3c79e0f4
**chmod: changing permissions of ‘/app’: Operation not permitted
The command '/bin/sh -c chmod 777 /app' returned a non-zero code: 1**

如何在Docker容器内赋予应用程序文件夹写入权限


2
问题在于,在 USER 之后使用 ADD/COPY 不会将新用户 ID 用作添加到容器中的文件的所有者 - 即使这是通知的用户所期望的。如所-random-dude 建议的那样使用 --chown 是修复方法,如果 Docker 开发人员知道他们在做什么,这不应该是必需的。 - Guss
4个回答

84

我猜你正在切换到用户名为“admin”的用户,但该用户没有更改/app目录权限的所有权。使用“root”用户更改所有权即可。下面是适用于我的Dockerfile:

FROM python:2.7
RUN pip install Flask==0.11.1 
RUN useradd -ms /bin/bash admin
COPY app /app
WORKDIR /app
RUN chown -R admin:admin /app
RUN chmod 755 /app
USER admin
CMD ["python", "app.py"] 

PS - 尝试去掉 "777" 权限。我曾经试图在上面的 Dockerfile 中做到这一点。


1
Docker镜像使用不同的Linux发行版。其中一些Linux没有useradd命令。在我的情况下,我不得不使用adduser才能使其正常工作。 - supritshah1289
这个解决方案是针对具有useradd二进制文件的Docker镜像python:2.7。无论如何,我很高兴这个答案在某种程度上能够帮助到你。 - vivekyad4v
2
我认为这对于非特权图像不起作用。实际上,它返回“操作不允许”。 - Matteo
创建 Docker 容器时使用了 -v /home/python:/app 参数,但是 /app 目录没有权限。 - HelloWorld
请注意:chownchmod可能会对整个镜像的大小产生影响:链接 - minus one

27

正如其他用户已经指出的那样,将USER admin移动到较后的步骤。

FROM python:2.7
RUN pip install Flask==0.11.1 
RUN useradd -ms /bin/bash admin
COPY --chown=admin:admin app /app
WORKDIR /app
USER admin
CMD ["python", "app.py"] 

对于版本在发布 v17.09.0-ce 及其之后的版本,您可以使用可选标志--chown=<user>:<group>ADDCOPY命令。

例如:

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

--chown标志的文档记录在Dockerfile参考页面中。


1
第二行,在 FROM ... 后面添加一行:
USER root

这将赋予您root用户的权限。

0

以 root 用户运行 Docker 镜像是不好的实践! 例如: 添加自定义用户并使用命令扩展权限

RUN addgroup -g 1001 -S 1000 && adduser -u 1001 -S 1000 -G 1000

你能再解释一下吗?目前在我的容器中,用户(jovyan)只能读写/home/jovyan。我希望用户也有对另一个文件夹/analyst的读写权限。上述内容如何实现这样的功能?目前在docker-compose中,我使用了user:root和GRANT_SUDO:“yes”…这允许任意读写,因此是次优选择。 - MikeB2019x

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接