为什么保存Redis后卷文件夹为空?

时间:2018-11-26 16:21:20

标签: docker redis docker-compose

代码

我正在尝试运行在docker-compose.yml内部定义的redis服务,如下所示:

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。 成功请求后,docker-compose进程将返回以下日志:

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.

我还尝试如下在redis服务中映射dump.rdb:

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

但是docker创建了一个名为 dump.rdb/ 的文件夹,而不是一个可读文件。

4 个答案:

答案 0 :(得分:1)

根据DockerHub页上的redis文档

  

如果启用了持久性,则数据存储在VOLUME / data

因此您使用了错误的卷路径。您应该改用/data

volumes:
    - ./redis-vol:/data 

答案 1 :(得分:0)

要能够通过docker-compose为您的容器装载单个文件,请使用要从文件系统装载的文件的绝对路径:

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

答案 2 :(得分:0)

正如codestation正确指出的那样,它位于 official documenation,但他建议 mount point而不是volumes,它还有一些其他缺点。
在这两种情况下,文档中都有关于“启用持久性”的声明:
$ docker run --name some-redis -d redis redis-server --appendonly yes
或在您的docker-compose文件中:

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

答案 3 :(得分:0)

如果您将音量映射更改为 <your-volume>:/data

确保删除以前的容器 docker container prune 在再次重新启动容器之前