Создать Docker-контейнер с предопределенным дампом Redis - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь создать докерский контейнер Redis с данными. Мой подход вдохновлен этим вопросом. Но по какой-то причине это не работает.

Вот мой Dockerfile:

FROM redis

EXPOSE 6379

COPY redis-dump.csv /

RUN nohup bash -c "redis-server --appendonly yes" & sleep 5s \
    && cat /redis-dump.csv | redis-cli --pipe \
    && redis-cli shutdown save
    && ls /data

и docker-compose.yml:

version: '3.3'

volumes:
  redisdata:

services:
  redis:
    build:
      context: docker/redis
    volumes:
      - redisdata:/data
    ports:
      - "6379:6379"

Когда я создал контейнер, Redis пуст. При подключении к контейнеру каталог /data также становится пустым. Но когда я вижу логи, когда докер создавал файлы dump.rdb и appendonly.aof. Файл дампа находится в контейнере. И когда я запускаю cat /redis-dump.csv | redis-cli --pipe в контейнере, данные доступны в Redis. Итак, вопрос в том, почему отсутствуют файлы базы данных?

Вот полные журналы создания контейнера:

Creating network "restapi_default" with the default driver
Creating volume "restapi_redisdata" with default driver
Building redis
Step 1/4 : FROM redis
 ---> a55fbf438dfd
Step 2/4 : EXPOSE 6379
 ---> Using cache
 ---> 2e6e5609b5b3
Step 3/4 : COPY redis-dump.csv /
 ---> Using cache
 ---> 39330e43e72a
Step 4/4 : RUN nohup bash -c "redis-server --appendonly yes" & sleep 5s     && cat /redis-dump.csv | redis-cli --pipe     && redis-cli shutdown save     && ls /data
 ---> Running in 7e290e6a46ce
7:C 10 May 2019 19:45:32.509 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
7:C 10 May 2019 19:45:32.509 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=7, just started
7:C 10 May 2019 19:45:32.509 # Configuration loaded
7:M 10 May 2019 19:45:32.510 * Running mode=standalone, port=6379.
7:M 10 May 2019 19:45:32.510 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
7:M 10 May 2019 19:45:32.510 # Server initialized
7:M 10 May 2019 19:45:32.510 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
7:M 10 May 2019 19:45:32.510 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
7:M 10 May 2019 19:45:32.511 * Ready to accept connections
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 67600
7:M 10 May 2019 19:45:37.750 # User requested shutdown...
7:M 10 May 2019 19:45:37.750 * Calling fsync() on the AOF file.
7:M 10 May 2019 19:45:37.920 * Saving the final RDB snapshot before exiting.
7:M 10 May 2019 19:45:37.987 * DB saved on disk
7:M 10 May 2019 19:45:37.987 # Redis is now ready to exit, bye bye...
appendonly.aof
dump.rdb
Removing intermediate container 7e290e6a46ce
 ---> 1f1cd024e68f

Successfully built 1f1cd024e68f
Successfully tagged restapi_redis:latest
Creating restapi_redis_1 ... done

Вот пример данных:

SET user:id:35 85.214.132.117
SET user:id:66 85.214.132.117
SET user:id:28 85.214.132.117
SET user:id:40 85.214.132.117
SET user:id:17 85.214.132.117
SET user:id:63 85.214.132.117
SET user:id:67 85.214.132.117
SET user:id:45 85.214.132.117
SET user:id:23 85.214.132.117
SET user:id:79 85.214.132.117
SET user:id:26 85.214.132.117
SET user:id:94 85.214.132.117

1 Ответ

2 голосов
/ 11 мая 2019

Вы должны удалить том перед запуском контейнера:

docker volume rm redisdata

Затем измените свой Dockerfile на следующее:

FROM redis

EXPOSE 6379

COPY redis-dump.csv /

ENTRYPOINT nohup bash -c "redis-server --appendonly yes" & sleep 5s \
    && cat /redis-dump.csv | redis-cli --pipe \
    && redis-cli save \
    && redis-cli shutdown \
    && ls /data

Для более быстрого результата я предлагаю отобразить томв локальную папку:

version: '3.3'

services:
  redis:
    build:
      context: .
    volumes:
      - ./redisdata:/data
    ports:
      - "6379:6379"

После того, как вы увидите, что он работает, вы можете вернуться к обычным томам докера.

Теперь запустите:

docker-compose build
docker-compose up -d

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

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

После обсуждений мы решили использовать мульти-стадийная сборка:

FROM redis as import 

EXPOSE 6379 

COPY redis-dump.csv / 

RUN mkdir /mydata 

RUN nohup bash -c "redis-server --appendonly yes" & sleep 5s \ 
&& cat /redis-dump.csv | redis-cli --pipe \ 
&& redis-cli save \ 
&& redis-cli shutdown \ 
&& cp /data/* /mydata/ 

RUN ls /mydata 

FROM redis 

COPY --from=import /mydata /data 
COPY --from=import /mydata /mydata 

RUN ls /data 

CMD ["redis-server", "--appendonly", "yes"]

Первый этап (импорт) практически такой же, как и опубликованный оригинал.Поскольку мы заметили, что после последней команды RUN файлы в / data удаляются, мы делаем копию в другой папке с именем /mydata.

На втором этапе используется то же изображение, что и в базе, но оно копирует только изпредыдущий этап, что ему нужно: данные из / mydata.Он помещает эти данные в папку / data и затем запускает сервер redis.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...