Pregunta Copia de archivos desde el host al contenedor Docker


Estoy tratando de construir una solución de respaldo y restauración para los contenedores Docker con los que trabajamos.

Tengo una imagen base de Docker que he creado, ubuntu:base, y no quiero tener que reconstruirlo cada vez con un archivo Docker para agregar archivos a él.

Quiero crear un script que se ejecute desde el equipo host y cree un nuevo contenedor usando el ubuntu:base Docker image y luego copia los archivos en ese contenedor.

¿Cómo puedo copiar archivos del host al contenedor?


875
2018-04-07 08:28


origen


Respuestas:


los cp comando se puede utilizar para copiar archivos. Un archivo específico se puede copiar como:

docker cp foo.txt mycontainer:/foo.txt
docker cp mycontainer:/foo.txt foo.txt

Múltiples archivos contenidos por la carpeta src se puede copiar en el target carpeta usando:

docker cp src/. mycontainer:/target
docker cp mycontainer:/src/. target

Referencia: Docker CLI docs para cp 

En las versiones Docker anteriores a la 1.8, solo fue posible copiar archivos de un contenedor al host. No del host a un contenedor.


1515
2017-08-12 17:25



  1. Obtener nombre de contenedor o ID de contenedor corto:

    $ docker ps
    
  2. Obtener ID de contenedor completo:

    $ docker inspect -f   '{{.Id}}'  SHORT_CONTAINER_ID-or-CONTAINER_NAME
    
  3. Copiar archivo:

    $ sudo cp path-file-host /var/lib/docker/aufs/mnt/FULL_CONTAINER_ID/PATH-NEW-FILE
    

EJEMPLO:

$ docker ps

CONTAINER ID      IMAGE    COMMAND       CREATED      STATUS       PORTS        NAMES

d8e703d7e303   solidleon/ssh:latest      /usr/sbin/sshd -D                      cranky_pare

$ docker inspect -f   '{{.Id}}' cranky_pare

o

$ docker inspect -f   '{{.Id}}' d8e703d7e303

d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5

$ sudo cp file.txt /var/lib/docker/aufs/mnt/**d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5**/root/file.txt

150
2017-07-17 14:01



La forma más limpia es montar un directorio de host en el contenedor antes de ejecutar su comando:

{host} docker run -v /path/to/hostdir:/mnt --name my_container my_image
{host} docker exec -it my_container bash
{container} cp /mnt/sourcefile /path/to/destfile

109
2017-08-12 21:28



La siguiente es una forma bastante fea de hacerlo, pero funciona.

docker run -i ubuntu /bin/bash -c 'cat > file' < file

101
2018-06-11 16:02



Si necesita hacer esto en un contenedor en ejecución, puede usar docker exec (agregado en 1.3).

Primero, encuentre el nombre o la identificación del contenedor:

$ docker ps
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS              PORTS                   NAMES
b9b7400ddd8f        ubuntu:latest                "/bin/bash"         2 seconds ago       Up 2 seconds                                elated_hodgkin

En el ejemplo anterior, podemos usar b9b7400ddd8f o elated_hodgkin.

Si quisieras copiar todo en /tmp/somefiles en el host de /var/www en el contenedor:

$ cd /tmp/somefiles
$ tar -cv * | docker exec -i elated_hodgkin tar x -C /var/www

Entonces podemos ejecutar /bin/bash en el contenedor y verificar que funcionó:

$ docker exec -it elated_hodgkin /bin/bash
root@b9b7400ddd8f:/# ls /var/www
file1  file2

37
2018-01-24 07:38



La solución se da a continuación,

Desde el shell Docker,

root@123abc:/root#  <-- get the container ID

Del anfitrión

cp thefile.txt /var/lib/docker/devicemapper/mnt/123abc<bunch-o-hex>/rootfs/root

El archivo se copiará directamente a la ubicación donde se encuentra el contenedor en el sistema de archivos.


32
2018-06-23 17:01



Otra solución para copiar archivos en un contenedor en ejecución es usar tar:

tar -c foo.sh | docker exec -i theDockerContainer /bin/tar -C /tmp -x

Copia el archivo foo.sh dentro /tmp del contenedor.

Editar: Eliminar reduntant -f, gracias a Maartens comentario.


25
2018-04-21 13:50



Muy fácil

  1. Crea un nuevo archivo docker y usa la imagen existente como tu base.

    FROM myName/myImage:latest
    
    ADD myFile.py bin/myFile.py
    
  2. Luego construye el contenedor:

    docker build .
    

20
2017-07-08 20:47



Para copiar un archivo desde el host al contenedor en ejecución

docker exec -i $CONTAINER /bin/bash -c "cat > $CONTAINER_PATH" < $HOST_PATH

Residencia en La respuesta de Erik y los comentarios de Mikl y z0r.


19
2017-07-01 09:09



Con Docker 1.8, docker cp es capaz de copiar archivos desde el host al contenedor. Ver la publicación de blog de Docker Anunciando Docker 1.8: Confianza en el contenido, Caja de herramientas y Actualizaciones al registro y la orquestación.


11
2017-08-12 17:22



Esta es una respuesta directa a la pregunta 'Copiar archivos desde el host al contenedor Docker' planteado en esta pregunta en el título.

Tratar docker cp. Es la forma más fácil de hacerlo y funciona incluso en mi Mac. Uso:

docker cp /root/some-file.txt some-docker-container:/root

Esto copiará el archivo some-file.txt en el directorio /root en su máquina host en el contenedor Docker llamado some-docker-container en el directorio /root. Está muy cerca de la sintaxis de copia segura. Y como se muestra en la publicación anterior, puede usarlo viceversa. Es decir, también copia los archivos del contenedor al host.

Y antes de que descargues esta publicación, ingresa docker cp --help. Leer la documentación puede ser muy útil, a veces ...

Si no te gusta de esa manera y quieres volúmenes de datos en tu contenedor ya creado y en ejecución, entonces la recreación es tu única opción hoy. Ver también ¿Cómo puedo agregar un volumen a un contenedor Docker existente?.


11
2017-09-23 13:18