Почему после сохранения Redis папка тома пуста?

Код

Я пытаюсь запустить службу Redis, определенную внутри docker-compose.yml, следующим образом:

version: '3'
services:
  redis:
    image: "redis:5-alpine"
    volumes:
      - ./redis-vol:/home/data 
  app:
    build: .
    ports:
      - 8080:8080
    volumes:
      - .:/home/app/

Это Dockerfile:

FROM python:2.7-alpine3.8
WORKDIR /home/app
COPY ./requirements.txt .
RUN apk add python2-dev build-base linux-headers pcre-dev && \
    pip install -r requirements.txt
# Source files
COPY ./api.py . 
COPY ./conf.ini .
CMD ["uwsgi", "--ini", "conf.ini"]

Приложение состоит из этого фрагмента, запускающего интерфейс uwsgi на порту 8080.

import uwsgi
import redis
r = redis.Redis('redis')
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    r.append('hello', 'world!')
    r.save()
    return [b"Hello World"]

И это файл conf.ini:

[uwsgi]
http = :8080 
wsgi-file = api.py 
master = true
process = 2
enable-threads = true
uid = 1001
gid = 1001

Предполагается, что служба приложения сохраняет пару key:value через redis каждый раз, когда получает запрос к http://localhost:8080. После успешного запроса процесс создания докеров возвращает следующий журнал:

redis_1_bdf757fbb2bf | 1:M 26 Nov 2018 15:38:20.399 * DB saved on disk
app_1_5f729e6bcd36   | [pid: 17|app: 0|req: 1/1] 172.21.0.1 () {38 vars in 690 bytes} [Mon Nov 26 15:38:20 2018] GET / => generated 11 bytes in 8 msecs (HTTP/1.1 200) 1 headers in 44 bytes (1 switches on core 0)
redis_1_bdf757fbb2bf | 1:M 26 Nov 2018 15:38:20.998 * DB saved on disk
app_1_5f729e6bcd36   | [pid: 17|app: 0|req: 2/2] 172.21.0.1 () {40 vars in 691 bytes} [Mon Nov 26 15:38:20 2018] GET /favicon.ico => generated 11 bytes in 4 msecs (HTTP/1.1 200) 1 headers in 44 bytes (1 switches on core 0)

Проблема

Несмотря на журнал DB saved on disk, папка redis_vol пуста, а файл dump.rdb, похоже, больше нигде не сохраняется.

Что я делаю не так? Я также пробовал использовать redis:alpine в качестве образа, но при запуске у меня возникает следующая ошибка:

redis_1_bdf757fbb2bf | 1:M 26 Nov 14:57:27.003 # Can't handle RDB format version 9
redis_1_bdf757fbb2bf | 1:M 26 Nov 14:57:27.003 # Fatal error loading the DB: Invalid argument. Exiting.

И я также попытался отобразить dump.rdb в сервисе redis следующим образом:

  redis:
    image: "redis:5-alpine"
    volumes:
      - ./redis-vol/dump.rdb:/home/data/dump.rdb

но докер создает папку с именем dump.rdb/ вместо читаемого файла.

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
0
2 567
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Согласно документации Redis на странице DockerHub

If persistence is enabled, data is stored in the VOLUME /data

Значит, вы используете неправильный путь к тому. Вы должны использовать /data вместо

volumes:
    - ./redis-vol:/data 

Чтобы смонтировать один файл для вашего контейнера с помощью docker-compose, используйте абсолютный путь к файлу, который вы хотите смонтировать, из вашей файловой системы:

  redis:
    image: "redis:5-alpine"
    volumes:
      - /Users/username/dirname/redis-vol/dump.rdb:/home/data/dump.rdb

Как правильно указал кодовая станция, он находится на официальная документация, но он предлагает точка крепления вместо тома, у которого есть некоторые дополнительные минусы. В обоих случаях в документации есть также утверждение о «настойчивости». включен ":
$ docker run --name some-redis -d redis redis-server --appendonly yes
или в вашем файле docker-compose:

    redis:
        image: "redis:alpine"
        command: redis-server --appendonly yes 
        volumes:
            - your-volume:/data

Если вы все еще сталкиваетесь с проблемой даже после изменения карты громкости на <your-volume>:/data

Обязательно удалите предыдущий контейнер с docker container prune перед повторным перезапуском контейнера

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