Tengo problemas para crear una imagen de un contenedor docker redis con los datos en la base de datos redis. En este momento estoy haciendo esto:
docker pull redis docker run --name my-redis -p 6379:6379 -d redis redis-cli 127.0.0.1:6379> set hello world OK 127.0.0.1:6379> save OK 127.0.0.1:6379> exit docker stop my-redis docker commit my-redis redis_with_data docker run --name my-redis2 -p 6379:6379 -d redis_with_data redis-cli 127.0.0.1:6379> keys * (empty list or set)Obviamente no estoy entendiendo algo bastante básico aquí. ¿Docker no se compromete a crear una nueva imagen a partir de un contenedor existente?
Bien, he estado investigando un poco. La imagen redis predeterminada en hub.docker usa un volumen de datos que luego se monta en /data en un contenedor. Para compartir este volumen entre contenedores, debe iniciar un nuevo contenedor con el siguiente argumento:
docker run -d --volumes-from <name-of-container-you-want-the-data-from> \ --name <new-container-name> -p 6379:6379 redisTenga en cuenta que el orden de los argumentos es importante; de lo contrario, la ejecución de la ventana acoplable fallará en silencio.
docker volume lsle dirá qué volúmenes de datos ya ha creado Docker en su computadora. Todavía no he encontrado una manera de dar a estos volúmenes un nombre trivial, en lugar de una larga cadena aleatoria.
Tampoco he encontrado una forma de montar un volumen de datos, sino que simplemente uso el comando --volumes-from .
Bueno. Ahora lo tengo funcionando, pero es torpe.
Con
docker volume ls docker volume inspect <id of docker volume>puede encontrar la ruta del volumen de la ventana acoplable en el sistema de archivos local. Luego puede montar esto en un nuevo contenedor de la siguiente manera:
docker run -d -v /var/lib/docker/volumes/<some incredibly long string>/_data:/data \ --name my-redis2 -p 6379:6379 redisObviamente, esta no es la forma en que debes hacer esto. Seguiré cavando.
Pongo todo lo que he descubierto hasta ahora en una publicación de blog: mi publicación de blog en medium.com
Tal vez eso le sirva a alguien
Los datos en la ventana acoplable no son persistentes, cuando reinicia el contenedor, sus datos desaparecerán. Para evitar esto, debe compartir un mapa en la máquina host con su contenedor. Cuando su contenedor se reinicie, obtendrá los datos del mapa en el host.
Puede leer más al respecto en los documentos de Docker: https://docs.docker.com/engine/tutorials/dockervolumes/#data-volumes
De los documentos del contenedor redis:
Ejecutar redis-servidor
docker run -d --name redis -p 6379:6379 dockerfile/redisEjecute redis-server con directorio de datos persistentes. (crea dump.rdb)
docker run -d -p 6379:6379 -v <data-dir>:/data --name redis dockerfile/redisEjecute redis-server con directorio de datos y contraseña persistentes.
docker run -d -p 6379:6379 -v <data-dir>:/data --name redis dockerfile/redis redis-server /etc/redis/redis.conf --requirepass <password>Usar el volumen de datos y compartir el archivo RDB manualmente no es feo, en realidad para eso está diseñado el volumen de datos, para separar los datos del contenedor.
Pero si realmente necesita/quiere guardar datos en una imagen y compartirlos de esa manera, simplemente puede cambiar el directorio de trabajo de redis de volumen /data a otro lugar:
La opción 1 está cambiando --dir cuando se inicia el contenedor redis:
docker run -d redis --dir /tmp Luego puede seguir sus pasos para crear una nueva imagen. Tenga en cuenta que este método solo puede usar /tmp debido a un problema de permisos.
La opción 2 es crear una nueva imagen con WORKDIR cambiado:
FROM redis RUN mkdir /opt/redis && chown redis:redis /opt/redis WORKDIR /opt/redis Luego docker build -t redis-new-image y usa esta imagen para hacer tu trabajo.