.dockerignore
文件的作用是告诉 Docker 构建镜像时,哪些文件或目录应该被忽略,不要被添加到构建上下文(build context)中。这对于优化镜像构建速度、减小镜像大小以及避免泄露敏感信息非常有用。
.dockerignore
的主要功能
-
减小构建上下文大小:
构建上下文是 Docker 构建镜像时,将 Dockerfile 所在目录及其所有子目录打包后传递给 Docker 守护进程的内容。通过.dockerignore
忽略不必要的文件,可以显著减小传输和构建时间。 -
保护敏感数据:
避免将一些敏感文件(如包含密码的配置文件、私钥等)打包到镜像中,从而提升安全性。 -
提高构建效率:
忽略无关文件,可以避免 Docker 在构建镜像时检查这些文件的修改状态,从而提升构建效率。
.dockerignore
的基本语法
-
每行一条规则:
.dockerignore
文件中的每一行表示一个忽略规则。 -
支持通配符:
*
:匹配任意数量的字符。?
:匹配单个字符。[abc]
:匹配任意一个括号内的字符。
-
支持目录匹配:
如果指定一个目录,整个目录及其内容都会被忽略。 -
支持注释:
以#
开头的行是注释,会被忽略。 -
规则优先级:
- 规则从上到下匹配。
- 使用
!
前缀可以强制包含某些被前面规则排除的文件或目录。
示例:.dockerignore
假设项目目录结构如下:
my-app/
│
├── .dockerignore
├── Dockerfile
├── node_modules/
├── logs/
│ └── app.log
├── .env
├── README.md
└── src/
├── app.js
└── config.js
.dockerignore
文件内容如下:
# 忽略 node_modules 目录
node_modules/
# 忽略日志文件
logs/
# 忽略所有环境变量文件
*.env
# 强制包含 README.md
!README.md
# 忽略所有的 .log 文件
*.log
规则解释:
node_modules/
:整个node_modules
目录及其所有内容都不会被包含。logs/
:logs
目录及其内容被忽略。*.env
:忽略所有以.env
为后缀的文件(如.env
,.env.local
)。!README.md
:强制包含README.md
文件,即使前面有其他规则可能排除它。*.log
:忽略所有.log
文件,无论在哪个目录下。
注意事项
.dockerignore
文件的作用仅限于构建阶段,它不会影响运行容器中的文件结构。.dockerignore
文件必须与Dockerfile
位于同一个目录中才能生效。- 文件被
.dockerignore
忽略后,它们不会被添加到构建上下文,因此 Dockerfile 中的指令(如COPY
和ADD
)也无法访问这些文件。
常见的忽略内容
Node.js 项目:
node_modules/
npm-debug.log
yarn-debug.log
yarn-error.log
.env
Python 项目:
__pycache__/
*.pyc
*.pyo
*.env
*.log
通用示例:
# IDE 文件
*.swp
*.idea/
*.vscode/
# 操作系统生成的文件
.DS_Store
Thumbs.db
# 日志文件
*.log
# 环境变量和配置文件
*.env
通过正确配置 .dockerignore
文件,可以有效提高 Docker 镜像构建的效率,避免无关文件进入镜像,同时防止敏感数据意外暴露。