Copie archivos del contenedor Docker al host

Isaac Tony 23 agosto 2022
  1. Use docker cp para copiar archivos del contenedor Docker al host
  2. Utilice los montajes de Docker para copiar archivos del contenedor de Docker al host
  3. Use COPY para copiar archivos del contenedor Docker al host
Copie archivos del contenedor Docker al host

Antes de Docker 1.8, solo podíamos copiar archivos del contenedor al host. Sin embargo, a medida que los contenedores se volvieron aún más populares, se hizo necesario copiar archivos hacia y desde contenedores.

Una de las razones comunes por las que podemos querer copiar archivos de un contenedor docker es compartir archivos de registro con los miembros de nuestro equipo. Sin embargo, no se permite copiar información confidencial, como recursos en /dev, /proc, /sys, tmpfs.

Este artículo discutirá cómo copiar archivos desde un contenedor Docker utilizando un DockerFile, el comando docker cp y montar directorios en la máquina host como volúmenes.

Esto requiere instalar y configurar Docker y un contenedor Docker correctamente. Esto funcionará en entornos Linux y WSL.

Use docker cp para copiar archivos del contenedor Docker al host

El comando docker cp es una de las formas más fáciles que podemos usar para copiar archivos y directorios también desde nuestra máquina host a un contenedor docker. Usaremos Ubuntu 20.4.5 y la última versión de Docker en ese momento, que es 19.03.

Sintaxis:

$ docker cp [OPTIONS] CONTAINER: SRC_PATH DEST_PATH|-

Donde:

  • SRC_PATH especifica la ruta de origen donde se encuentra el archivo que queremos copiar en el host.
  • DEST_PATH es la ruta de destino para almacenar el archivo en el contenedor.

Con este comando, podemos copiar archivos hacia y desde el contenedor intercambiando los parámetros SRC_PATH y DEST_PATH. Una ventaja de este comando es que podemos copiar archivos y directorios hacia y desde contenedores en ejecución o detenidos.

El comando docker cp se asemeja a Unix cp -a; por lo tanto, significa que también copia directorios recursivamente. Además, el comando también asume que todas las rutas al contenedor son relativas al directorio raíz.

Comenzaremos creando primero nuestro contenedor de destino; por lo tanto, también necesitamos una imagen. Usaremos la imagen oficial de Ubuntu disponible en el registro de Docker.

$ docker pull ubuntu

Luego crearemos un contenedor docker en modo separado e interactivo. Esto permite que nuestro contenedor se ejecute en segundo plano.

$ docker run -it -d ubuntu
e10b4a7bbc59131d30492a87dd70b8ea74fa686ed5036ec918b6596fc83efe2b

Usando el comando exec, ejecutaremos una sesión SSH interactiva usando el comando docker exec y el indicador -it. Esto nos permitirá ejecutar comandos de forma interactiva dentro del contenedor.

Para crear un archivo de texto simple, navegaremos a la carpeta /usr/share.

Comenzaremos ingresando al contenedor usando la identificación del contenedor respectivo.

$ docker exec -it e10b4a7bbc59 /bin/bash
root@e10b4a7bbc59:/#

Navegaremos por la carpeta /usr/share/ dentro del contenedor para crear nuestro archivo de texto.

$ docker exec -it e10b4a7bbc59 /bin/bash
root@e10b4a7bbc59:/# cd usr
root@e10b4a7bbc59:/usr# cd share
root@e10b4a7bbc59:/usr/share#

Crearemos un archivo llamado nuevo_archivo.txt usando el comando tocar. En breve copiaremos este archivo de este contenedor a nuestro host.

Por lo tanto, es bueno tomar nota del directorio donde se almacena el archivo, ya que usaremos esta ubicación al copiarlo en el host.

root@e10b4a7bbc59:/usr/share# touch new_file.txt

Para verificar que hemos creado el archivo, ejecute el comando ls para listar todos los archivos en este directorio, como se muestra a continuación.

root@e10b4a7bbc59:/usr/share# ls
adduser      bash-completion  debianutils  dpkg  keyrings  man           pam          polkit-1
apport       bug              dict         gcc   libc-bin  menu          pam-configs  sensible-utils
base-files   common-licenses  doc          gdb   lintian   misc          perl5        tabset
base-passwd  debconf          doc-base     info  locale    new_file.txt  pixmaps      terminfo

Ahora que hemos creado con éxito un archivo dentro de nuestro contenedor, queremos copiar este archivo de este contenedor a nuestro host: salga del contenedor al shell principal usando el comando exit.

Ejecutaremos el comando docker cp en la terminal y copiaremos el nuevo_archivo.txt a un directorio en la máquina host. Sin embargo, primero debemos tomar nota de tres cosas importantes:

  • La identificación del contenedor;
  • La ubicación del archivo de destino en el contenedor;
  • El directorio de destino en la máquina host donde copiaremos el archivo.
$ docker cp e10b4a7bbc59:/usr/share/new_file.txt ./new_file.txt

Hemos copiado con éxito el nuevo._archivo.txt en la máquina host ejecutando ese comando. Podemos verificar esto ejecutando el comando ls en esa carpeta en particular.

isaac@DESKTOP-HV44HT6:~/isaac$ ls
adduser      bash-completion  debianutils  dpkg  keyrings  man     `new_file.txt`  pixmaps         terminfo
apport       bug              dict         gcc   libc-bin  menu    pam           polkit-1
base-files   common-licenses  doc          gdb   lintian   misc    pam-configs   sensible-utils
base-passwd  debconf          doc-base     info  locale    my-app  perl5         tabset

Utilice los montajes de Docker para copiar archivos del contenedor de Docker al host

También podemos usar montajes de la ventana Docker para copiar archivos del contenedor de la ventana Docker al host.

Los montajes de enlace son una de las primeras soluciones que nos permiten conservar los datos mediante el montaje de nuestros contenedores docker en directorios en nuestro sistema host.

Los montajes de enlace nos permiten hacer referencia a un directorio exacto haciendo referencia a la ruta de archivo absoluta del directorio de destino. Además de copiar archivos del contenedor al host, también podemos crear servicios que dependen de directorios en el sistema host.

Para crear un montaje de la ventana Docker, podemos usar el indicador -v o --mount al crear el contenedor de la ventana Docker. Además de este indicador, también especificaremos el directorio en la máquina host que queremos asignar a un directorio en el contenedor docker.

A menudo se prefiere este método porque podemos crear varios montajes dentro de un contenedor docker. También podemos crear directorios para transferir archivos desde varios contenedores.

Para montar nuestro directorio al contenedor docker, debemos especificar los siguientes campos que siempre deben estar en el orden correcto separados por dos puntos. Éstos incluyen:

  • La ruta al directorio en la máquina host que queremos montar;
  • La ruta al directorio en el contenedor donde debemos montar este directorio;
  • Otras opciones opcionales como ro especifican el modo de solo lectura.

Sintaxis:

docker run -t -i -v <host_dir>:<container_dir

En el siguiente ejemplo, usamos las imágenes oficiales de Ruby para crear un contenedor y montar un directorio local en un directorio del contenedor. Una vez hecho esto, podemos copiar fácilmente archivos del contenedor al directorio local y viceversa.

$ docker run -it -v $HOME/Desktop/new_container:/new_container --name new_container ruby bash
root@7a00af9d4d96:/#

Podemos copiar fácilmente un archivo entre nuestro contenedor docker y el directorio del host. Además, tenga en cuenta que los archivos creados en el directorio del host estarán disponibles automáticamente en el directorio del contenedor docker montado en el host.

Use COPY para copiar archivos del contenedor Docker al host

Al crear una imagen docker usando un archivo docker, también podemos copiar archivos entre el host docker y el contenedor usando el comando COPY.

Sintaxis:

COPY <SRC> <DEST>

En el DockerFile a continuación, especificamos ./app.py como el directorio de origen y /var/www/app.py como el directorio de destino.

#  base image
FROM python

# Set your working directory
WORKDIR /var/www/

# Copy the necessary filesls
COPY ./app.py /var/www/app.py
COPY ./requirements.txt /var/www/requirements.txt

# Install the necessary packages
RUN pip install -r /var/www/requirements.txt

# Run the app
ENTRYPOINT ["echo", "Hello, Developer"]

Este DockerFile crea una imagen de una aplicación Flask simple que imprime un mensaje en la consola.

Autor: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn

Artículo relacionado - Docker Container