Я хочу сохранить свою базу данных sqlite между перезапусками контейнера и получением нового изображения.
Привет,
У меня есть файл docker-compose.yml:
services:
myservice:
image: myimage
container_name: thecontainername
volumes:
- ./app.db:/prisma/app.db
restart: always
watchtower:
image: containrrr/watchtower
container_name: watchtower
labels:
- "com.centurylinklabs.watchtower.enable=false"
environment:
- REPO_USER=${DOCKERHUB_USER}
- REPO_PASS=${DOCKERHUB_PASS}
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --cleanup --interval 120 --debug
restart: always
База данных Sqlite сохраняется между перезапусками контейнера, но не при получении нового образа вручную с помощью команды или автоматически с помощью сторожевой башни.
Как это можно решить?
Я могу ответить на вышеизложенное: SQLite использует файловую базу данных, так что да, app.db — это база данных.
@BMitch да, это файл, я также пробовал том с каталогом, содержащим файл базы данных, но это не сработало
Покажите, пожалуйста, ваш второй тест. Также покажите вывод docker diff перед удалением контейнера. И сведите к минимуму пример: сторожевая башня отвлекает от вашей проблемы.
Существует ли файл app.db в хост-системе? Можете ли вы просмотреть его содержимое, используя что-то вроде sqlite3 app.db? Действительно ли у вас правильный путь в контейнере; приложение ожидает найти базу данных точно в /prisma/app.db?
@DavidMaze В хост-системе сгенерированный файл app.db представляет собой пустой каталог (Docker позволяет томам указывать непосредственно на файлы?). Когда я пытаюсь поместить app.db в каталог проекта и создать с ним том (- ./data:/prisma/db) в моем файле docker-compose, сгенерированный каталог «данных» также пуст.
Результат сравнения докера @BMith: C /usr C /usr/src C /usr/src/myproject C /usr/src/myproject/prisma C /usr/src/myproject/prisma/app.db A /prisma A /prisma/ app.db
Мне кажется, что путь на стороне контейнера (/prisma/app.db) неправильный. Учитывая последний результат, нужно ли вместо него /usr/src/myproject/prisma/app.db? Если вы пытаетесь смонтировать один файл в контейнер, он должен уже существовать, иначе Docker создаст пустой каталог; часто проще монтировать каталоги, чем отдельные файлы.
Хорошо, это работает с ./app.db:/usr/src/myproject/prisma/app.db. Спасибо вам всем





Судя по дальнейшим действиям, вы установили неправильный путь внутри контейнера. Это показано, когда файлы, которые были изменены в файловой системе контейнера (отображаются docker diff), не соответствуют пути монтирования тома.
Обычно вы не хотите монтировать изменяемые файлы непосредственно в контейнере, а хотите смонтировать весь каталог. Это связано с тем, что многие инструменты, изменяющие файлы, создают новый временный файл, а затем переименовывают его, чтобы перезаписать существующий файл. Этот процесс создает новый индексный дескриптор, и монтирование томов привязывается к индексному дескриптору, в результате чего любые изменения внутри контейнера или вне контейнера не отражаются на другой стороне или между перезапусками контейнера.
Является ли
app.dbбазой данных и является ли это файлом, а не каталогом?