¿Necesita introducir o sacar algunos archivos de un contenedor Docker? El docker cp
El comando le permite copiar entre los sistemas de archivos del host y del contenedor para que pueda agregar detalles de configuración, crear copias de seguridad y restaurar los datos existentes.
Sintaxis básica
docker cp
acepta rutas de origen y destino como sus dos argumentos:
docker cp example.txt my-container:/example.txt
Aquí example.txt
se está copiando de su directorio de trabajo a /example.txt
en el my-container
envase. Puede invertir los dos argumentos para copiar /example.txt
fuera del contenedor y dentro de su directorio de trabajo.
El argumento que hace referencia a la ruta del contenedor debe tener como prefijo un ID o nombre de contenedor seguido de dos puntos (:
). Puede encontrar el ID o el nombre de un contenedor en ejecución con docker ps
.
Cada docker cp
El comando necesita una ruta del sistema de archivos local y una ruta del contenedor; no puede copiar directamente entre dos contenedores. Use un procedimiento de varios pasos si necesita hacer esto, copiando primero desde el contenedor de origen a su sistema de archivos, luego desde la nueva ruta local al contenedor de destino.
Copiando Directorios Completos
docker cp
también puede copiar directorios recursivamente:
docker cp /home/demo/website apache-container:/var/www/html/.
Docker copiará todo en /home/demo/website
y transferirlo a /var/www/html
.
Comportamiento de copia
Cuando está copiando un archivo, Docker crea un nuevo archivo en el destino si aún no existe. Los archivos existentes se sobrescriben con el nuevo contenido. Cuando el destino es un directorio, el archivo se copia en él usando el nombre del archivo de origen. Una excepción es cuando el destino especificado termina con un /
, que denota un directorio, pero la ruta aún no existe. En este escenario, se generará un error.
El proceso es un poco más complicado para las copias de directorio. Se creará un nuevo directorio en el destino con el contenido del directorio de origen, si la ruta de destino aún no existe. Cuando existe, el comportamiento difiere dependiendo de si ha incluido un final /.
componente en la ruta.
/.
está presente:el directorio de origen se copia en el directorio de destino existente./.
no está presente:el contenido del directorio de origen se copia en el destino.
La sutil distinción dicta si se crea un nuevo subdirectorio dentro del destino.
Limitaciones de comandos
A pesar de su nombre, docker cp
no es una implementación completa del cp
comando de concha. El cp
las banderas no son compatibles, excepto -a
y -L
:
-a
– Modo de archivo, que conserva los detalles del usuario y del grupo en los archivos copiados.-L
– Siga los enlaces simbólicos en el directorio de origen para copiar el contenido de los destinos de los enlaces, en lugar de los enlaces mismos.
Para casos de uso más avanzados en los que se requiere una copia selectiva, deberá recurrir a un enfoque diferente.
Uso de Bind Mounts para copiar archivos
Los volúmenes de Docker proporcionan otra forma de mover archivos entre contenedores y su host. El montaje de un directorio local en un contenedor le permite acceder a su contenido desde su sistema de archivos host, eliminando la necesidad de usar docker cp
.
docker run -v /example/host/directory:/container/path my-image:latest
El contenido del /example/host/directory
ruta se montan en el sistema de archivos del contenedor en /container/path
. Puede interactuar con estos archivos fuera de Docker utilizando herramientas familiares como cp
, rsync
y su navegador gráfico de archivos.
Esta técnica solo es útil cuando trabaja con un solo directorio contenedor. No funciona bien cuando está copiando desde ubicaciones arbitrarias, ya que necesita saber las rutas que usará con anticipación, cuando se cree el contenedor.
También debe tener cuidado con los permisos del sistema de archivos:los archivos creados dentro del contenedor generalmente serán propiedad de root
. Esto puede crear escenarios incómodos en el host en los que no puede editar o eliminar archivos dentro del directorio enlazado. Usa el chown
Comando en el host y dentro del contenedor para cambiar la propiedad según el entorno si es necesario.
Qué pasa con COPY
en Dockerfiles?
docker cp
a veces se puede confundir con COPY
instrucciones en Dockerfiles. Es importante reconocer que estas dos características sirven para casos de uso muy diferentes.
COPY
no se puede usar para mover archivos entre su host y un contenedor en ejecución. Es para convertir archivos en imágenes durante el proceso de construcción:
COPY /home/me/my-website /var/www/html/.
Aquí, el código fuente del sitio web se copia en una imagen como parte de una compilación. Este es un proceso de una sola vez. Cada contenedor iniciado desde la imagen incluiría la fuente del sitio web tal como estaba en el momento en que ejecutó docker build
.
docker cp
le permite reemplazar ese código fuente con una versión más nueva una vez que se ejecuta un contenedor. COPY
las instrucciones son para hacer que los archivos formen parte de una imagen estática; cp
los comandos interactúan con contenedores en vivo.
¿Cuándo copiar archivos con Docker?
La copia manual de archivos desde su host a un contenedor Docker, o viceversa, debería ser algo relativamente raro. Las imágenes están destinadas a ser autosuficientes, por lo que deben incluir todo lo que necesita para iniciar una instancia. La configuración generalmente se maneja a través de variables de entorno.
Los contenedores que necesitan almacenar datos de manera persistente deben usar volúmenes de Docker. Los volúmenes permiten que los datos sobrevivan a cualquier contenedor único, por lo que no es necesario docker cp
manualmente. antes de reemplazar una instancia. Cuando realice copias de seguridad, copie los volúmenes de su host, en lugar de extraer archivos de los contenedores.
docker cp
es más útil cuando se depuran contenedores o se trabaja en un entorno de desarrollo. A veces es necesario inyectar manualmente un archivo de configuración temporal o extraer un registro oculto. Usando docker cp
es más rápido y conveniente que reconstruir la imagen completa cada vez que realiza un cambio de código.
Recuerde siempre que los archivos copiados en los contenedores solo persistirán mientras el contenedor viva. Comenzar otro contenedor desde la misma imagen le dará una pizarra limpia, sin los archivos que agregó con docker cp
.
Resumen
docker cp
le permite mover archivos entre su host y sus contenedores Docker. Funciona con archivos y directorios, pero carece de la mayor parte de la funcionalidad avanzada del cp
basado en shell. comando.
Uso regular de docker cp
indica una desviación potencial de las mejores prácticas de contenedores. Es aconsejable tratarlo como una herramienta de conveniencia para uso de desarrollo, en lugar de una parte integral del trabajo con contenedores. La persistencia de archivos a largo plazo debe implementarse con volúmenes, ya que estos son componentes de primera clase en el ecosistema de Docker.