疑问:.dockerignore对docker-compose build是否无效?忽略**/static仍在镜像中
嘿,我来帮你拆解这两个关于Docker构建的问题:
当然适用!不过这里有个容易踩坑的细节:docker-compose build会使用你在docker-compose.yml的build配置里指定的context目录作为构建上下文,而.dockerignore必须放在这个上下文目录的根目录,Docker才会读取并应用它的规则。如果你的.dockerignore不在上下文根目录,那它就相当于不存在,起不到任何作用。
**/static但镜像中仍存在该目录的排查与解决 结合你的目录结构:
./context/ ├── .dockerignore ├── docker-compose.yml └── production/ └── django/ └── Dockerfile
我帮你梳理几个可能的原因和对应的解决办法:
规则写法不对,没覆盖到目标目录
**/static的规则只会匹配子目录下的static目录(比如production/django/static),但如果static目录直接在上下文根目录(./context/static),这个规则是匹配不到的。想要忽略所有层级的static目录(包括根目录下的),应该把规则改成:static/ **/static/注意末尾的
/必须加上,这样才会明确匹配目录,而不是同名的文件。你不该把
.dockerignore复制到Dockerfile所在目录
Docker只会读取构建上下文根目录下的.dockerignore,把它放到production/django/里完全没用,反而容易混淆。把它放回./context/根目录就好。Docker构建缓存搞的鬼
有时候之前构建的缓存会保留旧的目录内容,导致你修改.dockerignore后看不到效果。试试用无缓存构建:docker-compose build --no-cache my-imagestatic目录是在容器构建过程中生成的
如果你的Dockerfile里有类似DjangoRUN python manage.py collectstatic这样的命令,那这个static目录是在容器内部生成的,.dockerignore管不到这种情况——因为.dockerignore只负责排除本地上下文里的文件/目录,容器内构建时生成的内容不受它约束。如果是这种情况,你需要在Dockerfile里调整步骤,比如不需要的话就删除该目录,或者优化构建流程。
内容的提问来源于stack exchange,提问作者eugene

