Cómo copiar archivos con Docker cp a tu contenedor de Docker

Si necesitas copiar archivos desde el host de Docker a tu contenedor Docker, este tutorial es para ti.

En este tutorial, aprenderás a copiar archivos desde el host de Docker a un contenedor Docker utilizando diversos enfoques.

¡Comencemos!

Prerrequisitos

Si deseas seguir paso a paso, asegúrate de tener lo siguiente:

  • Docker instalado en el host de Linux. Este tutorial utiliza Docker v19.03.11. Puedes confirmar tu versión de Docker ejecutando docker version.

Copiando Archivos con el Comando docker cp

Para comenzar este tutorial, aprenderás a copiar archivos desde el host de Docker a los contenedores utilizando el comando docker cp. El comando docker cp copia archivos o carpetas entre un contenedor y el sistema de archivos local de tu host de Docker y viceversa.

Vamos a aprender cómo usar el comando Docker cp con un ejemplo.

1. Abre un terminal en tu máquina local.

2. Crea un archivo llamado myfile.txt usando el comando touch. El archivo myfile.txt será copiado desde el host de Docker al contenedor.

touch myfile.txt

3. Ejecuta el comando docker run. El siguiente docker run creará un nuevo contenedor en segundo plano. El comando siguiente contiene tres parámetros descritos a continuación:

  • d flag that runs the container in the background and keeps it alive until deleted.
  • p flag publishes a container’s port 80 to the host on port 80.
  • nginx será la imagen que se utilizará para ejecutar el contenedor.
sudo docker run -d -p 80:80 nginx
Executing the Docker run command

4. Verifica si el contenedor de Docker se ha creado correctamente utilizando el comando docker ps. Después de ejecutar el comando docker ps, deberías ver un nuevo valor generado bajo el atributo CONTAINER ID (En este caso ccae4670f030) usando la imagen NGINX que confirma que el contenedor se ha creado correctamente.

sudo docker ps
Verifying the docker container by running the docker ps command

Antes de ejecutar el comando Docker cp, la sintaxis del comando Docker cp es:

  • CONTAINER: SRC_PATH especifica la ruta de origen del contenedor.
  • DEST_PATH es la ruta de destino en el host.
  • CONTAINER: DEST_PATH es la ruta de destino en el contenedor.

Además, también puedes agregar las opciones con los siguientes parámetros en el comando de la siguiente manera:

  • Usar archive o a: Copia todos los permisos de usuario y grupo principal de los archivos y carpetas.
  • Usar L: Especificar la opción L permitirá que cualquier enlace simbólico en la Ruta de origen se copie en la ruta de destino.
# Sintaxis para copiar desde el contenedor al host de Docker
docker cp {options} CONTAINER:SRC_PATH DEST_PATH 
# Sintaxis para copiar desde el host de Docker al contenedor
docker cp {options} SRC_PATH CONTAINER:DEST_PATH 

5. A continuación, ejecuta el comando docker cp. El comando docker cp copiará el myfile.txt que creaste anteriormente al directorio /usr/share de los contenedores. ccae4670f030 es el ID del contenedor al que se copiará el myfile.txt.

sudo docker cp myfile.txt ccae4670f030:/usr/share

6. Por último, conéctate por SSH al contenedor en ejecución ejecutando el comando docker exec con /bin/bash, que se utiliza como shell predeterminado para el inicio de sesión de usuario del sistema Linux.

  • La bandera i indica que deseas abrir una sesión SSH interactiva en el contenedor. La bandera i no cierra la sesión SSH incluso si el contenedor no está adjunto.
  • La bandera t asigna un pseudo-TTY que debe usarse para ejecutar comandos de forma interactiva.sudo docker exec -it ccae4670f030 /bin/bash
sudo docker exec -it ccae4670f030 /bin/bash

Verás a continuación que ahora estás conectado al shell del contenedor cuando ejecutas docker exec.

SSH into the running container using docker exec command

7. Después de iniciar sesión en el contenedor, verifica si myfile.txt ha sido copiado al contenedor usando el comando ls.

  • ls es un comando para listar archivos de computadora en sistemas operativos Unix y similares a Unix.
  • grep buscará todos los archivos o carpetas que empiecen con la cadena my dentro del directorio usr/share.
Verifying the files in the container

Copiando archivos usando DockerFile

En la sección anterior, aprendiste cómo copiar los archivos en el contenedor ejecutando el comando Docker cp. ¿Qué pasa si necesitas copiar varios archivos de una vez? ¡Ciertamente, ejecutar múltiples comandos se convierte en una sobrecarga! Para resolver la ejecución de múltiples comandos cp, ¿por qué no intentar copiar archivos o carpetas en contenedores usando Dockerfile con comandos COPY?

Desplegar un contenedor y copiar los archivos/carpetas usando Dockerfile te permite eliminar los pasos de copia manuales que hiciste en la sección anterior. Un Dockerfile es un documento de texto que contiene todos los comandos que un usuario podría llamar en la línea de comandos para ensamblar una imagen.

Creemos un Dockerfile, ejecutemos un contenedor desde él y finalmente copiemos los archivos.

1. Crea una carpeta llamada ~/host-to-container-copy-demo, luego cambia (cd) el directorio de trabajo a esa carpeta. Esta carpeta contendrá todos los archivos que crearás en esta demostración.

mkdir ~/host-to-container-copy-demo
cd ~/host-to-container-copy-demo

2. Ahora, crea dos archivos de texto llamados myfile1.txt y myfile2.txt, cópialos y pégalos en los archivos, y guárdalos en el directorio ~/host-to-container-copy-demo.

# myfile1.txt
Hello This is my first file !
This is file will be copied in /usr/share directory from Docker host to Docker Container.
# myfile2.txt
Hello This is my second file !
This is file will be copied in /tmp directory from Docker host to Docker Container.

3. Crea otro archivo, copia/pega la siguiente configuración y guarda el archivo como Dockerfile dentro del directorio ~/host-to-container-copy-demo. Cuando termines, Docker utilizará este DockerFile para ejecutar todos los comandos necesarios para construir una nueva imagen de Docker sobre cualquier imagen base.

El DockerFile a continuación contiene varios pasos/instrucciones que construirán el nuevo contenedor:

  • FROM La instrucción FROM inicializa una nueva etapa de construcción y establece la Imagen Base para instrucciones subsecuentes.
  • COPY El comando COPY copia un archivo desde la máquina anfitriona de Docker (anfitrión de Docker) al contenedor.
# Instrucción para Dockerfile para crear una nueva imagen sobre la imagen base (ubuntu)
# Utilizando la imagen base ubuntu: latest
FROM ubuntu:latest
# Copiando myfile1.txt al directorio /usr/share del contenedor
COPY myfile1.txt /usr/share
# Copiando myfile2.txt al directorio /tmp del contenedor
COPY myfile2.txt /tmp

4. Verifique todos los archivos requeridos para construir la nueva imagen ejecutando el comando tree. Debería ver Dockerfile, myfile1.txt y myfile2.txt bajo el directorio ~/host-to-container-copy-demo.

Verifies files and folders using tree command

5. A continuación, construya la imagen ejecutando el comando docker build. La bandera t se utiliza para etiquetar la imagen updated_ubuntu_image con latest y . permite a Docker seleccionar todos los archivos necesarios desde el directorio de trabajo actual.

sudo docker build -t updated_ubuntu_image:latest .
Building the Docker image by running the docker build command

6. Ahora, verifique la nueva imagen construida updated_ubuntu_image ejecutando el comando docker images. Tenga en cuenta el atributo REPOSITORY. Este atributo es la etiqueta creada con la bandera -t en el paso anterior.

sudo docker images
Repository Attribute

7. Finalmente, ejecute el contenedor Docker usando la imagen recién construida ejecutando el comando docker run. La bandera -it instruye a Docker para asignar un pseudo-terminal conectado al stdin del contenedor. bash proporciona el shell predeterminado para el inicio de sesión del usuario del sistema Linux.

sudo docker run -it updated_ubuntu_image bash

Ahora verá que está en el shell Bash del contenedor Docker.

Running the container using docker run command.

8. A continuación, verifique si los archivos fueron copiados correctamente en el contenedor en los directorios /tmp y /usr/share ejecutando el comando ls.

Verifying the files if they are successfully copied on the container

Montar un Volumen de Almacenamiento y Acceder a Archivos con el Comando Docker Volume

Hasta ahora, has aprendido cómo copiar archivos del host al contenedor usando dos enfoques diferentes mediante el uso del comando docker cp y un DockerFile. Esta vez, aprendamos cómo compartir fácilmente sistemas de archivos entre el host y los contenedores usando el comando docker volume.

Suponiendo que todavía estás conectado al terminal:

1. Crea un volumen en el host de Docker ejecutando el comando docker volume create. El siguiente comando creará un volumen llamado my-vol. sudo docker volume create my-vol

sudo docker volume create my-vol

2. Verifica que el volumen se haya creado correctamente ejecutando el comando docker volume ls. El comando docker volume ls lista el volumen. Después de ejecutar el comando docker volume ls, verás my-vol en el atributo NOMBRE DEL VOLUMEN, lo que confirma que el volumen se creó correctamente.

sudo docker volume ls
Listing the docker volumes

3. A continuación, ejecuta el contenedor usando el comando docker run.

  • El contenedor llamado volume_testing utiliza la imagen nginx:latest.
  • d flag runs the container in the background and keeps it alive until deleted.
  • v flag mounts the volume my-vol created on Docker host to the container’s destination /app directory.
sudo docker run -d --name volume_testing -v my-vol:/app nginx:latest
Running the Docker command and attaching the volume with the container

4. Verifica si el volumen my-vol que creaste anteriormente está montado correctamente con el contenedor utilizando el comando docker inspect. El comando docker inspect proporciona la información del contenedor. Después de ejecutar el comando docker inspect, mostrará todos los detalles del contenedor especificado (volume_testing), incluidos los detalles de montaje, como se muestra a continuación.

sudo docker inspect volume_testing

A continuación, la instantánea de la imagen confirma que el volumen (my-vol) que creaste en el host está montado correctamente con el directorio /app del contenedor.

Verifying the volumes in the container

Conclusión

En este tutorial, aprendiste diferentes formas de copiar archivos o carpetas desde el host de Docker a los contenedores, como usar el comando Docker cp, los comandos de volumen de Docker y Dockerfile.

Entonces, ¿qué enfoque vas a utilizar a continuación para copiar datos del host a los contenedores de Docker?

Source:
https://adamtheautomator.com/docker-cp/