为何我的.dockerignore文件不生效?如何修复?
问题描述
配置了如下.dockerignore文件:
**/__pycache__ **/.venv **/.git **/.gitignore **/.dockerignore **/dockerfile* **/docker-compose* postgres_data/
对应的docker-compose.yml内容为:
version: '3.8' services: django_app: image: django_image container_name: Django build: context: . dockerfile: django_app/dockerfile command: - /bin/sh - -c - | python manage.py makemigrations python manage.py migrate --no-input python manage.py collectstatic --no-input gunicorn configurations.wsgi:application --bind 0.0.0.0:8000 volumes: - ./django_app:/django_app ports: - 8000:8000 env_file: - django_app/.envs/.env.django - django_app/.envs/.env.postgres depends_on: - postgres_host postgres_host: container_name: Postgres image: postgres:15-bookworm restart: unless-stopped ports: - 5432:5432 volumes: - ./postgres_data/:/var/lib/postgresql/data/ env_file: - django_app/.envs/.env.postgres
执行docker-compose up构建镜像时,.dockerignore指定忽略的文件仍出现在容器内。本地和容器内的目录列表如下:
本地根目录ls -la输出:
total 36 drwxrwxr-x 5 neptune neptune 4096 Aug 4 15:46 . drwxr-xr-x 3 neptune neptune 4096 Aug 2 21:27 .. drwxrwxr-x 7 neptune neptune 4096 Aug 4 17:24 django_app -rw-rw-r-- 1 neptune neptune 868 Aug 4 15:45 docker-compose.yml -rw-rw-r-- 1 neptune neptune 156 Aug 4 18:14 .dockerignore drwxrwxr-x 8 neptune neptune 4096 Aug 2 21:30 .git -rw-rw-r-- 1 neptune neptune 225 Aug 4 15:47 .gitignore drwx------ 19 999 root 4096 Aug 4 18:27 postgres_data -rw-rw-r-- 1 neptune neptune 848 Aug 4 12:08 README.md
本地django_app目录ls -la输出:
total 180 drwxrwxr-x 7 neptune neptune 4096 Aug 4 17:24 . drwxrwxr-x 5 neptune neptune 4096 Aug 4 15:46 .. drwxrwxr-x 4 neptune neptune 4096 Aug 3 18:37 account drwxrwxr-x 3 neptune neptune 4096 Aug 3 18:52 configurations -rw-r--r-- 1 root root 139264 Aug 4 17:07 db.sqlite3 -rw-rw-r-- 1 neptune neptune 361 Aug 4 16:59 dockerfile drwxrwxr-x 2 neptune neptune 4096 Aug 4 12:18 .envs -rwxrwxr-x 1 neptune neptune 670 Aug 2 21:38 manage.py -rw-rw-r-- 1 neptune neptune 220 Aug 4 17:13 requirements.txt drwxr-xr-x 4 root root 4096 Aug 4 18:22 staticfiles drwxrwxr-x 5 neptune neptune 4096 Aug 4 10:50 venv
容器内/django_app目录ls -la输出:
total 180 drwxrwxr-x 7 1000 1000 4096 Aug 4 13:54 . drwxr-xr-x 1 root root 4096 Aug 4 14:47 .. drwxrwxr-x 2 1000 1000 4096 Aug 4 08:48 .envs drwxrwxr-x 4 1000 1000 4096 Aug 3 15:07 account drwxrwxr-x 3 1000 1000 4096 Aug 3 15:22 configurations -rw-r--r-- 1 root root 139264 Aug 4 13:37 db.sqlite3 -rw-rw-r-- 1 1000 1000 361 Aug 4 13:29 dockerfile -rwxrwxr-x 1 1000 1000 670 Aug 2 18:08 manage.py -rw-rw-r-- 1 1000 1000 220 Aug 4 13:43 requirements.txt drwxr-xr-x 4 root root 4096 Aug 4 15:01 staticfiles drwxrwxr-x 5 1000 1000 4096 Aug 4 07:20 venv
问题原因
- 本地绑定卷完全覆盖镜像内容:
docker-compose.yml中给django_app配置了- ./django_app:/django_app的绑定卷,这会直接把本地django_app目录的所有文件同步到容器的/django_app目录,完全替换镜像构建时复制的内容。.dockerignore仅在镜像构建阶段生效,对绑定卷的文件同步没有任何限制,所以本地的venv、dockerfile等文件会直接出现在容器内。 - .dockerignore规则匹配错误:
.dockerignore里写的是**/.venv,但本地的虚拟环境目录是venv(没有前置点),这条规则无法匹配到本地的虚拟环境目录,就算没有绑定卷,构建镜像时也会把venv目录复制进去。
修复方法
方法一:调整绑定卷策略(生产环境推荐)
生产环境建议移除绑定卷,让容器直接使用镜像内的代码,这样.dockerignore的规则就能正常生效,避免本地文件污染容器环境:
修改docker-compose.yml中django_app的volumes部分,删除- ./django_app:/django_app这一行。
如果是开发环境需要热加载代码,可以改为按需挂载需要实时更新的代码目录,而非整个django_app:
volumes: - ./django_app/account:/django_app/account - ./django_app/configurations:/django_app/configurations # 根据开发需求挂载其他代码目录
同时要确保镜像构建时已经完成依赖安装等步骤,避免容器内出现依赖缺失。
方法二:修正.dockerignore规则
把.dockerignore里的**/.venv改成**/venv,匹配本地的虚拟环境目录:
**/__pycache__ **/venv **/.git **/.gitignore **/.dockerignore **/dockerfile* **/docker-compose* postgres_data/
注意:只要绑定卷存在,这条规则仅在构建镜像时生效,容器内的目录仍会被本地卷覆盖,所以要彻底解决容器内出现忽略文件的问题,需要结合绑定卷的调整一起操作。
内容的提问来源于stack exchange,提问作者mohsen neptune
相关产品推荐
相关产品推荐

