COPY --chown 是什么
COPY --chown 在复制文件的同时指定属主与属组,省掉先复制、再用 RUN chown 改属主的两步走。后者会让同一份文件在两层里各存一份,镜像体积接近翻倍;--chown 是构建非 root 运行镜像时的标准搭配。
基本信息
| 用途 | 复制并设置属主、属组,可同时用 --chmod 设权限 |
|---|---|
| 语法 | COPY --chown=用户:组 源 目标 |
| 数字形式 | --chown=1000:1000 适合镜像里没有同名账号的场景 |
| --chmod 要求 | 需要较新的 Dockerfile 语法版本 |
| 默认属主 | 不指定时为 root:root |
典型使用场景
- 构建非 root 运行的应用:文件属主一次到位,进程启动即可读写
- 多阶段构建把产物复制到运行阶段时顺手改属主,不再追加 chown 步骤
- 静态站点镜像把站点目录属主设为运行用户
- 入口脚本需要可执行权限时用 --chmod 一起设好,省掉一条 RUN
- 排查容器内写文件失败:核对镜像里文件属主与运行用户是否一致
- 把二进制产物复制进精简镜像时同步设权限,避免运行阶段不可执行
示例
示例
COPY --chown=1000:1000 ./app /app
COPY --chown=node:node --chmod=755 docker/entrypoint.sh /usr/local/bin/entrypoint.sh
COPY --chown=10001:10001 --from=build /out/app /app/server
# 不推荐:同一文件在两层的副本让体积接近翻倍
# COPY ./app /app
# RUN chown -R 1000:1000 /app两种改属主方式的差别
| 方式 | 涉及层数 | 影响 |
|---|---|---|
| COPY --chown | 一次复制完成 | 只保留最终文件,体积最小 |
| COPY 后 RUN chown | 同一文件出现在两层 | 体积接近翻倍,多出一条无效层 |
| 只加 --chmod | 仅改权限 | 权限到位但属主仍是 root |
| 运行期再改属主 | 需要额外权限与步骤 | 启动脚本变复杂,排查成本上升 |
--chown 会作用于被复制的全部文件和子目录,复制目录后无需再补一条递归 chown。
不写 --chown 时文件属主是 root:root,非 root 进程写不了这些文件,这是容器内权限问题最常见的来源之一。
用数字 UID:GID 而不是用户名,可以让同一份 Dockerfile 跨基础镜像复用,不依赖镜像里是否建过同名账号。