Docker не обновляет том при обновлении .sql файла - PullRequest
0 голосов
/ 02 мая 2018

У меня есть файл для создания докера, который выглядит так

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. Однако файл init.sql запоминает только первую «версию» этого файла. Любые последующие обновления игнорируются при запуске docker-compose up.

Вещи, которые я пробовал

  • Попробовал sudo docker-compose up --renew-anon-volumes --force-recreate, что тоже, похоже, не помогает.
  • Пробовал обрезать все тома с помощью sudo docker volume prune. Не помогает
  • Пробная обрезка докерной системы с помощью sudo docker system prune
  • Что работает, если я скопирую файл и его содержимое в новое имя файла. Не работает переименование файла

Итак, вопрос в том, как мне получить обновления содержимого init.sql, которые будут распознаваться моей установкой докера? Я не понимаю, почему изменения в init.sh принимаются, а изменения в init.sql игнорируются?

UPDATE

Одна важная информация - это то, что проект находится в общей папке виртуальной коробки, поэтому основная файловая система - vboxsf, в то время как все это происходит.

1 Ответ

0 голосов
/ 04 мая 2018

Получается, что основная файловая система играет здесь роль при использовании Docker Volumes . Я использовал virtualbox vm, и проект находился в файловой системе vboxsf. Поэтому при подключении тома в моем docker compose сценарии (?) Он все время подключался к vboxsf тому.

Когда я переместил проект из файловой системы vboxsf во что-то другое (независимо от того, что имеет файловая система моей домашней директории, ext4 я думаю), тогда обновления файлов работали, как и ожидалось.

----------- Я говорю здесь с исправлением, ссылка важна для отслеживания --------------

Насколько я понимаю, принцип работы vboxsf заключается в том, что изменения передаются между файловой системой хоста и гостя, и это воспринимается хостом и гостевой ОС. Существует также аспект доступа к разделяемой памяти, но у меня действительно нет таких знаний, чтобы уточнить это дальше.

Чтобы понять проблему, эта ссылка кажется лучшим ресурсом на данный момент: https://www.virtualbox.org/ticket/819?cversion=0&cnum_hist=70

------------------- Конец --------------------- -------------

Я не думаю, что это будет проблемой на производстве, но это определенно заставит вас усомниться в вашем здравом уме для местного развития.

Поэтому, когда вы используете виртуальную машину Linux для разработки, проверьте, какую файловую систему используют ваши тома Docker, прежде чем вы даже приступите к работе над проектом.

Нет сообщений об ошибках вообще, что является одним из худших обстоятельств при отладке этой проблемы !!

Я также потратил впустую около 2 дней жизни, пытаясь выяснить, что происходит и как это исправить. Надеемся, что эти 2 потраченных впустую дня могут привести к экономии многих дней: D

...