Попытка сохранить данные контейнера докеров

Я хочу сохранить свою базу данных 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 сохраняется между перезапусками контейнера, но не при получении нового образа вручную с помощью команды или автоматически с помощью сторожевой башни.

Как это можно решить?

Является ли app.db базой данных и является ли это файлом, а не каталогом?

BMitch 27.05.2024 00:42

Я могу ответить на вышеизложенное: SQLite использует файловую базу данных, так что да, app.db — это база данных.

Perttu Haliseva 27.05.2024 08:14

@BMitch да, это файл, я также пробовал том с каталогом, содержащим файл базы данных, но это не сработало

wil 27.05.2024 09:06

Покажите, пожалуйста, ваш второй тест. Также покажите вывод docker diff перед удалением контейнера. И сведите к минимуму пример: сторожевая башня отвлекает от вашей проблемы.

BMitch 27.05.2024 12:06

Существует ли файл app.db в хост-системе? Можете ли вы просмотреть его содержимое, используя что-то вроде sqlite3 app.db? Действительно ли у вас правильный путь в контейнере; приложение ожидает найти базу данных точно в /prisma/app.db?

David Maze 27.05.2024 12:49

@DavidMaze В хост-системе сгенерированный файл app.db представляет собой пустой каталог (Docker позволяет томам указывать непосредственно на файлы?). Когда я пытаюсь поместить app.db в каталог проекта и создать с ним том (- ./data:/prisma/db) в моем файле docker-compose, сгенерированный каталог «данных» также пуст.

wil 27.05.2024 13:39

Результат сравнения докера @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

wil 27.05.2024 13:50

Мне кажется, что путь на стороне контейнера (/prisma/app.db) неправильный. Учитывая последний результат, нужно ли вместо него /usr/src/myproject/prisma/app.db? Если вы пытаетесь смонтировать один файл в контейнер, он должен уже существовать, иначе Docker создаст пустой каталог; часто проще монтировать каталоги, чем отдельные файлы.

David Maze 27.05.2024 14:04

Хорошо, это работает с ./app.db:/usr/src/myproject/prisma/app.db. Спасибо вам всем

wil 27.05.2024 14:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Судя по дальнейшим действиям, вы установили неправильный путь внутри контейнера. Это показано, когда файлы, которые были изменены в файловой системе контейнера (отображаются docker diff), не соответствуют пути монтирования тома.

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

Другие вопросы по теме