HOWTO · Docker

Copie archivos del host al contenedor Docker

Este tutorial demuestra cómo copiar archivos del host al contenedor Docker.

En esta página

Para transferir un archivo una sola vez a un contenedor existente, use docker cp con una ruta local y otra del contenedor:

docker cp ./local-file CONTAINER:/existing-directory/

Sustituya CONTENEDOR por el nombre o ID del contenedor. docker cp funciona con contenedores en ejecución y detenidos. Las rutas locales relativas se resuelven desde el directorio actual; las rutas del contenedor parten de /, aunque la barra inicial es opcional. Consulte la referencia de docker cp para la sintaxis completa.

Copie un archivo a un contenedor existente

Este comando copia hello.txt al directorio /opt/ de demo-app; el directorio debe existir:

docker cp ./hello.txt demo-app:/opt/

Como /opt/ ya existe, el resultado es /opt/hello.txt. La barra final deja claro que el destino es un directorio. Si el destino es un archivo existente, docker cp reemplaza su contenido; compruébelo antes si eso puede ser peligroso.

Para verificar la copia en un contenedor en ejecución, ejecute un comando directo:

docker exec demo-app ls -l /opt/hello.txt

La salida debe mostrar el archivo. docker exec requiere que el contenedor esté en ejecución, aunque docker cp también acepta uno detenido.

Copie un directorio o solo su contenido

docker cp copia directorios de forma recursiva. La forma de escribir el origen decide si se copia el directorio o únicamente lo que contiene:

# Creates /opt/host-files/ in the container.
docker cp ./host-files demo-app:/opt/

# Copies the contents of host-files into the existing /opt/incoming/ directory.
docker cp ./host-files/. demo-app:/opt/incoming/

En el segundo caso, /opt/incoming/ debe existir. El sufijo /. evita crear un nivel adicional llamado host-files. Docker no crea directorios padre ausentes: un destino terminado en / tiene que ser un directorio existente. Las reglas detalladas de archivo y directorio están en la documentación de destinos de docker cp.

Elija entre docker cp, COPY y un montaje bind

Necesidad Use Motivo
Agregar ahora un archivo a un contenedor existente docker cp Hace una copia única en el sistema de archivos de ese contenedor.
Incluir archivos en cada compilación de imagen COPY en el Dockerfile Añade archivos del contexto de compilación a la imagen.
Compartir durante el desarrollo un directorio del host con el contenedor Montaje bind Comparte la ruta en tiempo de ejecución; no crea otra copia.

Para incluir un archivo de aplicación en la imagen, use un Dockerfile:

COPY ./config.yaml /app/config.yaml

COPY se ejecuta durante la compilación y no modifica un contenedor que ya existe. Sus rutas de origen se interpretan desde el contexto de compilación; una ruta fuera de ese contexto no está disponible normalmente. Véase la referencia de Dockerfile COPY.

Para compartir cambios repetidos, cree el contenedor con un montaje bind:

docker run --mount type=bind,source=/absolute/host/path,target=/app/input,readonly IMAGE

Un montaje bind comparte almacenamiento. Sin readonly, un proceso del contenedor puede modificar o borrar los archivos del host a los que tenga acceso. Monte un directorio del host para compartir archivos en directo cuando sea lo que realmente necesita; Docker también documenta las implicaciones de permisos y uso compartido de los montajes bind.

Tampoco use docker cp como configuración de imagen: la copia queda en la capa escribible de este contenedor; sobrevivirá al reiniciarlo, pero no aparecerá en un contenedor de reemplazo creado desde la imagen.

Evite errores frecuentes de docker cp

Compruebe las rutas antes de copiar. El origen local debe existir. Al copiar un archivo a un destino inexistente sin / final, Docker puede crear el archivo con ese nombre exacto, pero no sus directorios padre. Para un directorio origen, puede crear el directorio final si su padre existe; no puede copiar un directorio sobre un archivo.

Por defecto, los archivos que entran en el contenedor pertenecen al usuario y grupo de destino, normalmente root:root. Use -a solo si conservar el UID y GID de origen es adecuado para los usuarios del contenedor. Un enlace simbólico local se copia como enlace de forma predeterminada; use -L para copiar su destino. Los permisos del destino también pueden impedir una copia útil.

Por último, docker cp no puede copiar ciertas rutas del sistema del contenedor, como recursos bajo /proc, /sys o /dev, sistemas de archivos temporales y montajes creados por el usuario. Para esos casos use un enfoque específico del contenedor y revise las limitaciones documentadas.