Copie archivos del contenedor Docker al host
-
Use
docker cp
para copiar archivos del contenedor Docker al host - Utilice los montajes de Docker para copiar archivos del contenedor de Docker al host
-
Use
COPY
para copiar 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.
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.
LinkedInArtículo relacionado - Docker Container
- Comprobar si el contenedor Docker se está ejecutando o no
- Ejecute contenedores de forma continua en segundo plano con Docker
- Eliminar contenedores de forma permanente en Docker
- Ingrese un contenedor Docker en ejecución con un nuevo pseudo TTY
- La diferencia entre el contenedor de Docker y la imagen de Docker
- Listar solo los contenedores detenidos en Docker