更新.sql文件时,Docker不更新卷

时间:2018-05-02 10:54:00

标签: 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
 |-- 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
  • 修剪docker系统
  • 如果我将文件及其内容复制到新文件名,那么工作是什么。 重命名文件不起作用

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

更新

一个重要信息是项目位于虚拟机共享文件夹上,因此基础文件系统为vboxsf,而所有这些都发生了。

1 个答案:

答案 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