He probado una imagen de Docker usando la línea de comandos de docker sin especificar nombres para los volúmenes. Ahora descubrí que quiero continuar usando este contenedor/imagen pero definiendo el contenedor en docker compose.
Qué es mejores prácticas para mantener los datos de los volúmenes anónimos/sin nombre y usarlos en el nuevo contenedor creado por docker compose?
- ¿Puedo convertir de alguna manera los volúmenes sin nombre en volúmenes con nombre?
- ¿o debería crear un nuevo contenedor con docker Compose con volúmenes con nombre y copiar los datos?
- o cualquier otra opción?
Para resumir el transitoria:
docker volume create --name <new_volume>docker run --rm -it -v <old_volume>:/from:ro -v <new_volume>:/to alpine \ ash -c "cd /from ; cp -av . /to"docker volume rm <old_volume>
Este método tiene la ventaja de usar la API de Docker. Utiliza una imagen ligera de Linux llamada alpine
y su shell predeterminado, ash
para ejecutar una copia de archivo, cp -av
del volumen antiguo al volumen recién nombrado.
Actualmente no puede cambiar el nombre de los volúmenes existentes. (Esto es cierto tanto si se nombraron previamente como si no y sus nombres se generaron automáticamente.)
Puedes ver este problema para obtener más información sobre la implementación de esta función, así como para agregar su "+1"/"Pulgar hacia arriba" para que los desarrolladores sepan que lo desea.
Sin eso, hasta donde yo sé, la única buena manera de hacerlo es crear el nuevo volumen con nombre y copiar los datos.
La respuesta de CivFan no funcionó para mí tal como está, así que estoy publicando mi solución aquí:
docker run --rm --volumes-from <container_name> -v <new_volume_name>:/to ubuntu bash -c "cd <source_dir>; cp -r . <dest_dir>/."
Esto copia el contenido de source_dir
en el envase con container_name
en dest_dir
dentro del nuevo volumen new_volume_name
.
Para verificar que funcionó, puede enumerar el contenido de dest_dir
con:
docker run --rm -i -v <new_colume_name>:/tmp ubuntu find /tmp
En el momento de escribir este artículo, la única opción es copiar los datos. Los detalles pueden variar dependiendo de su configuración particular. La lista general de pasos a realizar es la siguiente:
-
Detenga y retire el contenedor de origen para permitir que se cree el nuevo volumen en el paso 3.
docker stop NAMEdocker rm NAME# ordocker-compose stop SERVICEdocker-compose rm SERVICE
En algunos casos, es posible que pueda posponer la eliminación del contenedor de origen, por ejemplo, al cambiar de docker-compose
volumen anónimo a docker-compose
volumen con nombre. En este caso up
crearía el nuevo volumen. Y puede proceder a copiar los datos. Pero incluso en este caso, se recomienda detener el contenedor para evitar que se modifiquen los datos a medida que los copia. Y tienes que quitar el contenedor de origen para docker-compose
para cambiar al nuevo volumen (preste atención a las advertencias).
En algunos casos, no es realmente necesario, por ejemplo, al cambiar de contenedores independientes a docker-compose
.
Cambio docker-compose.yml
en su caso.
-
Inicie el nuevo contenedor para el nuevo volumen que se va a crear.
Contenedores independientes:
docker run ...# ordocker-compose up -d
-
Detenga el nuevo contenedor para evitar que se modifiquen los datos.
docker stop ...# ordocker-compose stop
En caso de migrar a, por ejemplo, un contenedor independiente con un volumen con nombre, puede crear el volumen en lugar de iniciar/detener el contenedor.
-
Copie los datos.
docker run --rm -v "SRC_VOLUME:/from" -v "DST_VOLUME:/to" \ bash -c ' shopt -s dotglob # rm -r /to/* # e.g. pg might have populated the new volume cp -r /from/* /to '
Donde SRC_VOLUME, DST_VOLUME: nombre, id o ruta absoluta del volumen a un directorio en el host.
Para enumerar los volúmenes adjuntos a un contenedor, use:
docker inspect CONTAINER --format '{{json .Mounts}}' | jq
Donde CONTAINER - nombre o ID del contenedor.
-
Inicie el nuevo contenedor.
docker run ...# ordocker-compose up -d
Alegrar :)
En caso de que desee experimentar con diferentes configuraciones, consulte lo siguiente esencia.
Encontré esto buscando información sobre volúmenes con nombre. Me doy cuenta de que este es un post antiguo, pero después de leerlo investigué un poco y descubrí que es posible, al menos en este momento, exportar el sistema de archivos como un tarball, y importar un archivo tar a una imagen o como una imagen.
Primero exporte el sistema de archivos de sus contenedores:
docker container export -o filename CONTAINER
Y después / al crear un nuevo contenedor, importe el tarball a su sistema de archivos:
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
Si especifica un archivo, Docker lo desarma en el contenedor en relación con / (raíz).
También puedes crear imágenes sin etiquetar con este pequeño dandy:
docker import filesystem.tar