Я пытаюсь запустить службу 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/ вместо читаемого файла.


Согласно документации 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
перед повторным перезапуском контейнера