COPY 通配与多源复制
COPY 支持通配符与多源复制:一次复制多个文件或按通配匹配一批文件时,目标必须是目录。源是目录时复制的是目录内容而不是目录本身,这一点与 shell 下拷目录的习惯不同,容易少拷或多套一层。
基本信息
| 通配 | COPY *.json /app/ |
|---|---|
| 多源 | COPY a.txt b.txt /dst/,目标需为目录 |
| 目录语义 | COPY src/ /app/src/ 复制的是 src 的内容 |
| 匹配范围 | 在构建上下文内匹配,受 .dockerignore 影响 |
| 缓存影响 | 匹配到的文件内容参与层缓存计算 |
典型使用场景
- 一次复制多个配置文件进镜像,减少指令条数
- 按通配复制一类文件,如所有 JSON 配置或所有脚本
- 分步复制:先复制依赖清单再复制源码,提升缓存命中率
- 把入口脚本与配置分别复制到不同目录,各自设置权限与属主
- 排查文件没进镜像:核对通配是否匹配到、是否被忽略规则排除
- 精简镜像时只复制运行必需的文件,避免整目录复制带入杂物
示例
示例
COPY *.json /app/ # 通配复制所有 JSON 文件
COPY requirements.txt pyproject.toml /app/ # 多源复制,目标必须是目录
COPY docker/entrypoint.sh /usr/local/bin/ # 单文件复制
COPY --chown=10001:10001 --chmod=755 docker/*.sh /usr/local/bin/
# 目录复制:复制 src 的内容到目标目录
COPY src/ /app/src/写法与结果对照
| 写法 | 效果 | 注意 |
|---|---|---|
| COPY a.txt b.txt /dst/ | 两个文件复制到目录 | 目标不是目录时构建失败 |
| COPY *.json /app/ | 通配匹配到的文件全部复制 | 没有匹配到会报 no source files |
| COPY src/ /app/src/ | 复制 src 的内容 | 不会多套一层 src 目录 |
| COPY src /app/src/ | 同样复制内容 | 按内容理解更不容易出错 |
| COPY --from=build /out/ /app/ | 从构建阶段复制目录内容 | 制品落地常用写法 |
通配符在构建上下文内匹配,受 .dockerignore 影响;匹配结果直接参与层缓存计算,文件增减都会让缓存失效。
与 shell 的拷贝语义不同:COPY 源目录不加通配也复制内容,写成 src/* 反而会漏掉隐藏文件(如 .env、.eslintrc)。
多源复制时目标要以斜杠结尾表示目录,写成文件路径会让构建直接报错,这一条能省下不少排查时间。