linux - 更新 .sql 文件时 Docker 不更新卷

标签 linux docker docker-compose devops

我有一个看起来像这样的 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 文件夹如下所示:

|- scripts
 |-- init.sh
 |-- init.sql

问题

我的这个项目的工作流程是渐进的,所以我在我的主机操作系统上添加了一些 SQL 初始化数据,运行 sudo docker-compose down -v 然后 sudo docker-compose up。我没有将我的用户更新为在这种情况下不需要使用 sudo。

当我更新 init.sh 文件时,这些更新会在我每次运行 docker-compose up 时反射(reflect)出来。然而,init.sql 文件只记住该文件的第一个“版本”。运行 docker-compose up 时将忽略任何后续更新。

我尝试过的事情

  • 尝试了 sudo docker-compose up --renew-anon-volumes --force-recreate 似乎也没有帮助。
  • 尝试使用 sudo docker volume prune 修剪所有卷。没有帮助
  • 尝试使用 sudo docker system prune 修剪 docker 系统
  • 如果我将文件及其内容复制到一个新的文件名中,就会起作用。 重命名文件不起作用

所以问题很简单,如何让 init.sql 的内容更新被我的 docker compose 设置识别?我不明白为什么选择了对 init.sh 的更改,但忽略了对 init.sql 的更改?

更新

一个重要的信息是该项目位于一个 virtualbox 共享文件夹中,因此底层文件系统是 vboxsf 而所有这一切都在发生。

最佳答案

事实证明,底层文件系统在使用 Docker Volumes 时发挥了作用。我一直在使用 virtualbox 虚拟机,该项目位于 vboxsf 文件系统上。因此,当在我的 docker compose 场景中附加一个卷时(?),它一直附加到一个 vboxsf 卷。

当我将项目从 vboxsf 文件系统移动到其他文件系统时(无论我的主目录文件系统有什么,ext4 我认为)然后对文件的更新按预期工作。

------------我在这里更正,链接很重要,需要跟踪------------

我的理解是,vboxsf 的工作方式是在主机和 guest 文件系统之间广播更改,并由主机和 guest 操作系统获取。还有一个关于如何访问共享内存的方面,但我真的没有那种知识可以进一步详细说明。

要理解这个问题,这个链接似乎是目前最好的资源: https://www.virtualbox.org/ticket/819?cversion=0&cnum_hist=70

--------------------结束-------------------- --------------

我不认为这会是生产中的问题,但它肯定会让你质疑你本地开发的理智。

因此,当您使用 Linux VM 进行开发时,请在开始处理项目之前检查您的 Docker 卷使用的是哪个文件系统。

根本没有错误消息,这是调试此问题时最糟糕的情况之一!

我还浪费了大约 2 天的时间试图弄清楚发生了什么以及如何解决它。希望这 2 天浪费的时间可以节省很多天 :D

关于linux - 更新 .sql 文件时 Docker 不更新卷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50132909/

相关文章:

linux - 这个奇怪的 docker 命令是什么意思?

docker-compose - 如何使用警报管理器配置普罗米修斯?

apache - Docker:镜像构建失败

linux - 网络文件系统是否预取? (或 : Do Internet File System make optimizations to reduce round trips)

linux - 如何在 Linux 中阻止用户组?

c++ - 在 Linux 中为 c++ 使用 gprof -f 选项

docker - 如何在多地点场景中配置 Prometheus?

r - 使用shinyFiles进行文件夹选择在更新后停止工作

linux - 在 bash 脚本中运行 tar 返回 "Output with bankrupt according to previous errors"

docker - 如何在 Windows 机器上访问 docker 数据卷?