Estoy tratando de capturar el estado de un contenedor docker como una imagen, de manera que incluya los archivos que he agregado a un volumen dentro del contenedor. Entonces, si ejecuto el contenedor original de esta manera:
$ docker run -ti -v /cookbook ubuntu:14.04 /bin/bash root@b78f3599d936:/# cd cookbook root@b78f3599d936:/cookbook# touch foo.txtAhora, si exporto o confirmo el contenedor como una nueva imagen acoplable y luego ejecuto un contenedor desde la nueva imagen, entonces el archivo foo.txt nunca se incluye en el directorio / libro de cocina.
Mi pregunta es si hay una forma de crear una imagen a partir de un contenedor de manera que permita que la imagen incluya contenido de archivo dentro de sus volúmenes.
Bueno, al poner los cambios en un volumen, los está excluyendo del contenedor real. La documentación para la exportación de Docker incluye esto:
El comando docker export no exporta el contenido de los volúmenes asociados con el contenedor. Si un volumen se monta encima de un directorio existente en el contenedor, la exportación de docker exportará el contenido del directorio subyacente, no el contenido del volumen.
Consulte Copia de seguridad, restauración o migración de volúmenes de datos en la guía del usuario para ver ejemplos de cómo exportar datos en un volumen.
Esto apunta a esta documentación . Siga los pasos allí para exportar la información almacenada en el volumen.
Probablemente estés buscando algo como esto:
docker run --rm --volumes-from <containerId> -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /cookbook Esto crearía un archivo backup.tar con el contenido del directorio /cookbook de recetas del contenedor y lo almacenaría en el directorio actual del host. Luego podría usar este archivo tar para importarlo en otro contenedor.
si hay una manera de crear una imagen a partir de un contenedor de manera que permita que la imagen incluya contenido de archivo dentro de sus volúmenes?
No, debido a que el volumen está diseñado para administrar datos dentro y entre sus contenedores Docker, se usa para conservar y compartir datos. Lo que está en la imagen suele ser su programa (artefactos, ejecutables, librerías, por ejemplo) con todo su entorno, construir/actualizar datos a la imagen no tiene mucho sentido.
Y en documentos de volúmenes , nos dijeron:
- Los cambios en un volumen de datos no se incluirán cuando actualice una imagen.
También en documentos de docker commit :
- La operación de confirmación no incluirá ningún dato contenido en los volúmenes montados dentro del contenedor.
Esencialmente, hay tres formas de hacer persistencia en Docker:
Puede guardar archivos en un volumen, que es un sistema de archivos administrado por Docker. Esto es lo que sucede en su ejemplo: debido a que el directorio /cookbook de recetas es parte de un volumen, su archivo no se compromete/exporta con la imagen. Sin embargo, se almacena en el volumen, por lo que si vuelve a montar el mismo volumen en un contenedor diferente, encontrará su archivo allí. Puede listar sus volúmenes usando docker volume ls . Como puede ver, probablemente debería dar nombres a sus volúmenes si planea reutilizarlos. Puede montar un volumen existente o crear uno nuevo, si el nombre no existe, con
docker run -v name:/directory ubuntu
Puede conservar los archivos como parte de la imagen. Si confirma el contenedor, todos los cambios en su jerarquía de archivos se almacenan en la nueva imagen, excepto los realizados en los volúmenes montados. Entonces, si simplemente se deshace del indicador -v , su archivo aparece en la confirmación.
Puede vincular el montaje de un directorio desde la máquina host al contenedor mediante la sintaxis -v /hostdir:/targetdir . El contenedor simplemente tiene acceso a un directorio de la máquina host.