You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何容器内无法删除使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:10:22