Вы должны удалить том перед запуском контейнера:
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.