Gestionar archivos dentro y fuera de un contenedor es una necesidad constante cuando se trabaja con Docker. Más allá de los bind mounts y los volúmenes, existe un comando práctico y directo que permite introducir o extraer archivos de cualquier contenedor, incluso cuando este no está corriendo: docker cp.
¿Cómo funciona docker cp para copiar archivos a un contenedor?
El comando docker cp funciona de manera similar al cp de bash. Recibe dos parámetros principales: el origen y el destino. Dependiendo del orden, podemos meter archivos al contenedor o sacarlos de él.
Para copiar un archivo desde nuestra máquina hacia un contenedor [03:12], el flujo es:
- Crear el archivo en la máquina local, por ejemplo con
touch prueba.txt.
- Levantar un contenedor con
docker run -d --name copy-test ubuntu.
- Ejecutar
docker cp prueba.txt copy-test:/testing/test.txt.
El formato después del nombre del contenedor usa dos puntos para indicar la ruta interna donde queremos colocar el archivo. Además, podemos cambiarle el nombre al archivo destino en el mismo comando.
¿Se pueden copiar directorios completos?
Sí. docker cp no se limita a archivos individuales. Para extraer un directorio completo desde un contenedor a nuestra máquina [04:45], simplemente invertimos el orden de los parámetros:
bash
docker cp copy-test:/testing local-testing
Esto copia todo el directorio testing del contenedor como local-testing en nuestra máquina. Al listar su contenido, encontramos los mismos archivos que existían dentro del contenedor.
¿Es necesario que el contenedor esté corriendo?
No es necesario. Esta es una característica muy útil de docker cp [05:30]. Basta con que el contenedor exista, aunque esté detenido. Un caso práctico: si un contenedor ejecuta un proceso de build de una aplicación y termina exitosamente generando un binario o artefacto, podemos extraer ese resultado con docker cp sin necesidad de volver a iniciar el contenedor.
¿Cuáles son las tres formas de manejar datos en Docker?
Docker ofrece tres mecanismos principales para gestionar datos, cada uno con su caso de uso específico [06:15]:
- Bind mount: vincula directamente un directorio del sistema de archivos del host con el contenedor. El acceso es irrestricto, lo que lo hace ideal para desarrollo y pruebas rápidas donde necesitamos que los cambios se reflejen de inmediato.
- Volúmenes: el área del sistema de archivos está gestionada por Docker. No tenemos acceso simple a esos datos desde fuera, lo que brinda mayor garantía de seguridad aunque con menos comodidad. Son perfectos para compartir datos entre contenedores o cuando queremos que la información sobreviva al ciclo de vida de un contenedor.
- TMPFS mount: disponible únicamente en instalaciones de Docker sobre Linux, este montaje existe solo en memoria. Los datos nunca tocan el disco y desaparecen al eliminar el contenedor.
¿Para qué sirve un TMPFS mount?
El temporary file system mount resulta útil en escenarios donde necesitamos escribir archivos temporales de gran tamaño que no queremos persistir de ninguna manera [07:20]. Un ejemplo práctico: un proceso que escanea archivos en busca de virus. El archivo se introduce en memoria, se analiza y luego se descarta. Al destruir el contenedor, tenemos la garantía de que esos datos desaparecen por completo.
¿Cuándo usar cada opción de manejo de datos?
La elección depende del contexto:
- Desarrollo local: bind mounts para editar código y ver resultados al instante.
- Persistencia y portabilidad: volúmenes cuando los datos deben existir independientemente del contenedor.
- Datos efímeros y sensibles: TMPFS mounts cuando la información no debe quedar escrita en disco.
- Transferencias puntuales:
docker cp para mover archivos o directorios sin necesidad de configurar montajes.
Con estas herramientas se cubre prácticamente cualquier necesidad de gestión de datos en Docker. Si ya experimentaste con alguna de estas opciones o tienes un caso de uso particular, comparte tu experiencia en los comentarios.