为何容器内无法删除使用COPY --chown复制的目录?
问题:COPY --chown复制的目录无法被指定用户删除的原因
我无法理解为何在容器内以指定用户身份,无法删除通过COPY --chown user:group命令复制的目录,但使用RUN chown命令后却可以正常删除。
文件目录结构
. ├── Dockerfile.copy ├── Dockerfile.run └── build └── file.txt
Dockerfile.copy
FROM alpine:latest WORKDIR /opt/app RUN addgroup -g 98765 -S mygroup && adduser -S -u 56789 -G mygroup -D myuser COPY --chown=myuser:mygroup build /opt/app/build USER myuser:mygroup
执行命令及结果
$ docker build --file=Dockerfile.copy --tag=copy:latest --progress="plain" . > ... building $ docker run copy:latest whoami > myuser $ docker run copy:latest ls -altrh > total 12K > drwxr-xr-x 1 root root 4.0K Jan 13 09:25 .. > drwxr-xr-x 4 myuser mygroup 4.0K Jan 13 09:26 build > drwxr-xr-x 1 root root 4.0K Jan 13 09:26 . $ docker run copy:latest rm -rf build > rm: can't remove 'build': Permission denied
执行rm -rf build时收到错误:
rm: can't remove 'build': Permission denied
Dockerfile.run
FROM alpine:latest WORKDIR /opt/app RUN addgroup -g 98765 -S mygroup && adduser -S -u 56789 -G mygroup -D myuser COPY build /opt/app/build RUN chown -R myuser:mygroup /opt/app USER myuser:mygroup
执行命令及结果
$ docker build --file=Dockerfile.run --tag=run:latest --progress="plain" . > ... building $ docker run run:latest rm -rf build > (无输出,执行成功)
Docker版本
$ docker --version > Docker version 20.10.21, build baeda1f
原因分析
核心问题在于父目录/opt/app的权限:
COPY --chown=myuser:mygroup build /opt/app/build仅会修改build目录及其内部文件的属主,但/opt/app目录本身仍然属于root用户。而删除目录的操作本质是修改父目录的内容(移除该目录的条目),这需要对父目录拥有写入权限。由于myuser对/opt/app没有写入权限,因此无法删除build目录。RUN chown -R myuser:mygroup /opt/app是递归修改/opt/app下所有内容的属主,包括/opt/app目录本身。此时myuser对父目录拥有写入权限,自然可以正常删除build目录。
你可以通过在两个镜像中执行ls -ld /opt/app验证这一点:copy镜像中该目录属主为root:root,而run镜像中为myuser:mygroup。
内容的提问来源于stack exchange,提问作者wscourge
相关产品推荐
相关产品推荐

