Contenido

Tutorial de docker cp: copia archivos entre el host y un contenedor

docker cp copia archivos entre el host y un contenedor. Funciona tanto si el contenedor está en marcha como si está detenido.

Sintaxis

docker cp [OPCIONES] CONTENEDOR:RUTA-ORIGEN DESTINO-EN-HOST     # contenedor → host
docker cp [OPCIONES] RUTA-ORIGEN-EN-HOST CONTENEDOR:RUTA-DESTINO   # host → contenedor
OpciónDescripción
-a, --archiveConserva la información de propietario (uid/gid)
-L, --follow-linkSi el origen es un enlace simbólico, copia el archivo al que apunta
-q, --quietNo muestra el progreso de la copia

Si usas - como origen o destino, se lee de la entrada estándar o se escribe en la salida estándar en formato tar.

Ejemplos

Ejecuta estos comandos con un contenedor nginx llamado web:

$ docker cp web:/etc/nginx/nginx.conf ./nginx.conf

$ head -n 3 nginx.conf

user  nginx;
worker_processes  auto;

$ echo "<h1>copied in</h1>" > page.html

$ docker cp page.html web:/usr/share/nginx/html/page.html

$ docker exec web cat /usr/share/nginx/html/page.html
<h1>copied in</h1>

$ docker cp web:/etc/nginx/conf.d ./confd

$ ls confd
default.conf

$ docker cp web:/no/such/file .
Error response from daemon: Could not find the file /no/such/file in container web
ComandoDescripción
docker cp web:/etc/nginx/nginx.conf ./nginx.confCopia el archivo de configuración del contenedor al host; se suele usar para obtener la configuración por defecto antes de editarla
docker cp page.html web:/usr/share/nginx/html/page.htmlCopia un archivo del host al contenedor
docker cp web:/etc/nginx/conf.d ./confdCopia una carpeta entera. Si el destino confd no existe, Docker lo crea y coloca dentro el contenido de la carpeta
docker cp web:/no/such/file .Error que aparece cuando el origen no existe

Reglas al copiar carpetas:

  • El destino no existe: se crea la carpeta de destino y se copia dentro el contenido de la carpeta de origen (como en el ejemplo anterior).
  • El destino ya existe: la carpeta de origen entera queda dentro del destino, como destino/nombre-carpeta-origen.
  • La ruta de origen termina en /. (por ejemplo, web:/etc/nginx/conf.d/.): se copia solo el contenido, no la carpeta.

Cuándo usar docker cp

Casos adecuados:

  • Sacar del contenedor archivos de configuración por defecto, registros o archivos generados.
  • Copiar temporalmente un archivo al contenedor para hacer pruebas.
  • Hacer copias de seguridad y restaurar bases de datos en Windows PowerShell: primero exportas a un archivo dentro del contenedor y luego lo copias fuera con docker cp. Así evitas que PowerShell no admita < y los problemas de codificación (consulta Mensajes de error comunes).

Casos no adecuados:

  • Sincronizar código durante el desarrollo: usa un bind mount o docker compose watch (consulta Aplicaciones Node.js).
  • Datos que debas conservar: usa un Volume.

Capítulos relacionados

Ejercicios

Ejercicio: copia la página de bienvenida de nginx /usr/share/nginx/html/index.html del contenedor web al host, cambia el título y vuelve a copiarla. Comprueba el resultado en el navegador (inicia el contenedor con -p 8080:80).

Respuesta
docker cp web:/usr/share/nginx/html/index.html ./index.html
# Edita index.html con un editor
docker cp ./index.html web:/usr/share/nginx/html/index.html

Actualiza http://localhost:8080 para ver el cambio. El cambio desaparece al eliminar el contenedor.

Preguntas frecuentes

¿Puedo usar docker cp con un contenedor detenido?

Sí. docker cp lee y escribe directamente en el sistema de archivos del contenedor, así que puedes copiar archivos aunque esté detenido. Es útil cuando un contenedor no arranca y necesitas sacar un archivo de configuración o un registro para revisarlo.

¿Se conserva un archivo de configuración que cambié con docker cp al recrear el contenedor?

No. Los archivos copiados al contenedor están en su capa de escritura y desaparecen al eliminarlo. Para los archivos que debas conservar, usa un bind mount o inclúyelos en la imagen.

¿Existe un comando equivalente en docker compose?

Sí: docker compose cp servicio:ruta destino. La sintaxis es la misma, pero con el nombre del servicio en lugar del nombre del contenedor.

Actualizado 14 de octubre de 2026