COPY 默认递归复制整个源目录,包括.git、node_modules等冗余文件,导致镜像臃肿、构建缓慢和信息泄露;.dockerignore在构建上下文上传前过滤路径,语法类似.gitignore,须置于上下文根目录且路径相对。

COPY 指令会把本地文件复制进镜像,但不会自动跳过.git、node_modules这类目录——得靠 .dockerignore 来提前过滤。
为什么 COPY 会复制不需要的文件?
Docker 的 COPY(以及 ADD)默认递归复制整个源目录,包括隐藏文件和构建时用不到的临时文件。比如执行 COPY . /app,若项目根目录有 node_modules、.git、logs/ 或 test/,它们全会被打包进镜像,导致镜像臃肿、构建变慢、甚至泄露敏感信息。
.dockerignore 的作用就是“告诉 Docker:这些别碰”
它工作在 COPY/ADD 执行前,是构建上下文(build context)的过滤器。Docker 守护进程在发送上下文到构建环境之前,就按 .dockerignore 规则排除匹配路径——被忽略的文件根本不会上传,COPY 自然也复制不到。
- 语法类似 .gitignore,支持通配符(
*、**)、注释(#)、取反(!) - 必须放在构建上下文根目录(即 docker build 命令指定的 PATH 所在位置)
- 不支持绝对路径,所有路径都相对于上下文根目录
典型 .dockerignore 内容示例
以 Node.js 项目为例:
# 忽略开发依赖和缓存 node_modules/ npm-debug.log .yarn/ .yarn/cache/ <h1>忽略版本控制和本地配置</h1><p>.git .gitignore .gitmodules</p><h1>忽略测试与文档(除非构建需要)</h1><p>test/ <strong>tests</strong>/ docs/ *.md</p><h1>忽略日志和临时文件</h1><p>logs/ <em>.log </em>.tmp</p><h1>但保留某些子目录(如 public 下的静态资源)</h1><p>!public/ !public/*<em>/</em></p>
注意:!public/ 这类取反规则要写在对应忽略规则之后,否则无效。
COPY 与 .dockerignore 配合的关键细节
- 如果 COPY 指定了具体文件(如
COPY package.json .),.dockerignore 不起作用——因为没用到目录遍历 - 如果用了
COPY src/ ./src/,那 .dockerignore 中的src/node_modules/才会生效 - 构建命令的上下文路径很重要:
docker build -f Dockerfile .中的.是上下文起点,.dockerignore 必须放在这里 - 可以用
docker build --no-cache --progress=plain .加--progress=plain查看实际上传了哪些文件,验证忽略是否生效










