我有一个看起来像这个
的docker compose文件version: '3'
services:
webapp:
build: '.'
ports:
- "8000:8000"
networks:
- db
postgres:
image: "postgres:alpine"
environment:
POSTGRES_PASSWORD: "password"
volumes:
- "./scripts:/docker-entrypoint-initdb.d"
networks:
- db
networks:
db:
脚本文件夹如下所示:
|- scripts
|-- init.sh
|-- init.sql
问题
我的这个项目的工作流程是渐进的,所以我在主机操作系统上添加了一些SQL初始化数据,运行sudo docker-compose down -v
然后sudo docker-compose up
。我没有更新我的用户,因为这种情况不需要使用sudo。
当我更新init.sh
文件时,每次运行docker-compose up
时都会反映这些更新。但是,init.sql
文件只会记住此文件的第一个“版本”。运行docker-compose up
时,将忽略任何后续更新。
我尝试过的事情
sudo docker-compose up --renew-anon-volumes --force-recreate
,似乎也没有帮助。sudo docker volume prune
修剪所有卷。没有帮助sudo docker system prune
所以问题很简单,我如何获得init.sql
的内容更新,以便我的docker compose setup识别?我不明白为什么选择init.sh
的更改但忽略对init.sql
的更改?
更新
一个重要信息是项目位于虚拟机共享文件夹上,因此基础文件系统为vboxsf
,而所有这些都发生了。
答案 0 :(得分:0)
事实证明,当使用Docker Volumes 时,底层文件系统正在这里扮演角色。我一直在使用虚拟机vm,项目位于vboxsf
文件系统上。因此,在我的docker compose
方案(?)中附加卷时,它一直附加到vboxsf
卷。
当我将项目从vboxsf
文件系统移动到其他东西时(无论我的主目录文件系统有什么,我认为ext4
)然后对文件的更新按预期工作。
----------- 我在这里纠正,链接很重要跟踪 --------------
我的理解是vboxsf的工作方式是在主机和来宾文件系统之间广播变更,这是由主机和来宾操作系统选择的。关于如何访问共享内存还有一个方面,但我真的没有那种知识可以进一步详细说明。
要了解此问题,此链接似乎是目前最好的资源: https://www.virtualbox.org/ticket/819?cversion=0&cnum_hist=70
------------------- 结束 -------------------- --------------
我不认为这会成为制作中的问题,但它肯定会让你质疑你对当地发展的理智。
因此,当您使用Linux VM进行开发时,请在开始处理项目之前检查您的Docker卷正在使用哪个文件系统。
根本没有错误消息,这是调试此问题时最糟糕的情况之一!!
我也浪费了大约2天的生命,试图找出正在发生的事情以及如何解决这个问题。希望这2天浪费的日子可以节省很多天:D