.dockerignore文件不修改镜像内容,只过滤构建上下文:排除node_modules/、.git/、logs/、.env等本地开发产物、运行时生成物和敏感配置,通过减小上传体积来加速构建、提升缓存命中率并防止信息泄露。

.dockerignore 文件是优化 Docker 构建最直接有效的手段之一。它不修改镜像内容,也不影响 Dockerfile 逻辑,只控制“哪些文件传给构建守护进程”,从而减少上下文体积、加快传输、避免敏感信息泄露。
它到底过滤什么?
执行 docker build 时,Docker 默认把当前目录(即构建上下文)下所有文件打包上传。哪怕你 Dockerfile 里只 COPY 一个 main.js,整个目录也全发过去。.dockerignore 就是在这一步做减法——被忽略的文件根本不会上传,自然也不会参与构建缓存计算或意外混入镜像。
- 它不影响镜像内最终存在的文件,只影响“传什么过去”
- 语法和 .gitignore 几乎一致,易上手
- 必须放在构建上下文根目录(通常就是 Dockerfile 所在目录)
哪些文件最该忽略?
重点排除三类:本地开发产物、运行时生成物、敏感配置。常见项包括:
- node_modules/(Node.js)——依赖应由 RUN npm install 安装,确保环境纯净
- .git/、.gitignore——版本控制数据与镜像无关
- logs/、*.log、*.out——日志是运行时产生的,不应进构建上下文
- .env、.env.local、secrets.json——防止密钥、数据库密码等泄露
- .idea/、.vscode/、.DS_Store、Thumbs.db——编辑器和系统临时文件
- dist/、build/、target/——前端/Java 等项目的编译产物,若用多阶段构建,应在容器内生成而非复制
写法要注意的关键细节
看似简单,但几处细节容易出错:
- 以 / 开头表示从上下文根目录匹配(如 /node_modules 更精准)
- ** 支持跨目录匹配(如 **/*.pyc 可忽略所有层级的 pyc 文件)
- ! 表示取反,用于“先忽略再恢复”(例如忽略所有 .js,但保留 src/index.js)
- 注释用 # 开头,空行会被跳过
- 路径区分大小写,且不支持正则,只认 glob 模式
验证是否生效的小技巧
别只靠猜,用这几招确认 .dockerignore 起作用了:
- 运行 docker build --no-cache -t test . 后查看日志开头:“Sending build context to Docker daemon …” 后面的字节数明显变小了,说明过滤成功
- 临时加一行 * 再构建,如果报错说找不到 Dockerfile 或源码,就证明它真正在起作用
- 用 docker build --dry-run .(Docker 23.0+)可预览实际上传的文件列表


















