Compartir comentarios
Las respuestas se generan en base a la documentación.

docker container cp

DescripciónCopia archivos o carpetas entre un contenedor y el sistema de archivos local
Usodocker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
Alias
docker cp

Descripción

La utilidad docker cp copia el contenido de SRC_PATH en DEST_PATH. Puedes copiar desde el sistema de archivos del contenedor a la máquina local o a la inversa, desde el sistema de archivos local al contenedor. Si se especifica - para SRC_PATH o DEST_PATH, también puedes transmitir un archivo tar desde STDIN o hacia STDOUT. El CONTAINER puede ser un contenedor en ejecución o detenido. SRC_PATH o DEST_PATH pueden ser un archivo o un directorio.

El comando docker cp asume que las rutas del contenedor son relativas al directorio / (raíz) del contenedor. Esto significa que suministrar la barra diagonal inicial es opcional; el comando ve compassionate_darwin:/tmp/foo/myfile.txt y compassionate_darwin:tmp/foo/myfile.txt como idénticos. Las rutas de la máquina local pueden ser valores absolutos o relativos. El comando interpreta las rutas relativas de una máquina local como relativas al directorio de trabajo actual desde donde se ejecuta docker cp.

El comando cp se comporta como el comando de Unix cp -a en el sentido de que los directorios se copian de forma recursiva conservando los permisos si es posible. La propiedad se establece en el usuario y el grupo principal en el destino. Por ejemplo, los archivos copiados a un contenedor se crean con el UID:GID del usuario root. Los archivos copiados a la máquina local se crean con el UID:GID del usuario que invocó el comando docker cp. Sin embargo, si especificas la opción -a, docker cp establece la propiedad al usuario y grupo principal en el origen. Si especificas la opción -L, docker cp sigue cualquier enlace simbólico en SRC_PATH. docker cp no crea directorios padre para DEST_PATH si no existen.

Suponiendo un separador de ruta /, un primer argumento de SRC_PATH y un segundo argumento de DEST_PATH, el comportamiento es el siguiente:

  • SRC_PATH especifica un archivo
    • DEST_PATH no existe
      • el archivo se guarda en un archivo creado en DEST_PATH
    • DEST_PATH no existe y termina con /
      • Condición de error: el directorio de destino debe existir.
    • DEST_PATH existe y es un archivo
      • el destino se sobrescribe con el contenido del archivo de origen
    • DEST_PATH existe y es un directorio
      • el archivo se copia en este directorio utilizando el nombre base (basename) de SRC_PATH
  • SRC_PATH especifica un directorio
    • DEST_PATH no existe
      • DEST_PATH se crea como un directorio y el contenido del directorio de origen se copia en este directorio
    • DEST_PATH existe y es un archivo
      • Condición de error: no se puede copiar un directorio en un archivo
    • DEST_PATH existe y es un directorio
      • SRC_PATH no termina con /. (es decir: barra seguida de punto)
        • el directorio de origen se copia dentro de este directorio
      • SRC_PATH sí termina con /. (es decir: barra seguida de punto)
        • el contenido del directorio de origen se copia dentro de este directorio

El comando requiere que SRC_PATH y DEST_PATH existan de acuerdo con las reglas anteriores. Si SRC_PATH is local y es un enlace simbólico, por defecto se copia el enlace simbólico y no el destino. Para copiar el destino del enlace y no el enlace en sí, especifica la opción -L.

Se usan dos puntos (:) como delimitador entre el CONTAINER y su ruta. También puedes usar : al especificar rutas a un SRC_PATH o DEST_PATH en una máquina local, por ejemplo archivo:nombre.txt. Si usas : en una ruta de la máquina local, debes ser explícito con una ruta relativa o absoluta, por ejemplo:

`/ruta/al/archivo:nombre.txt` o `./archivo:nombre.txt`

Opciones

OpciónPredeterminadoDescripción
-a, --archiveModo de archivo (copia toda la información de uid/gid)
-L, --follow-linkSigue siempre los enlaces simbólicos en SRC_PATH
-q, --quietSuprime la salida del progreso durante la copia. La salida del progreso se suprime automáticamente si no hay una terminal conectada

Ejemplos

Copiar un archivo local en el contenedor

$ docker cp ./some_file CONTAINER:/work

Copiar archivos desde el contenedor a la ruta local

$ docker cp CONTAINER:/var/logs/ /tmp/app_logs

Copiar un archivo desde el contenedor a la salida estándar (stdout). Ten en cuenta que el comando cp produce un flujo tar

$ docker cp CONTAINER:/var/logs/app.log - | tar x -O | grep "ERROR"

Casos particulares

No es posible copiar ciertos archivos del sistema como recursos bajo /proc, /sys, /dev, tmpfs, y montajes creados por el usuario en el contenedor. Sin embargo, puedes copiar dichos archivos ejecutando manualmente tar en docker exec. Los dos ejemplos siguientes hacen lo mismo de maneras diferentes (considerando que SRC_PATH y DEST_PATH son directorios):

$ docker exec CONTAINER tar Ccf $(dirname SRC_PATH) - $(basename SRC_PATH) | tar Cxf DEST_PATH -
$ tar Ccf $(dirname SRC_PATH) - $(basename SRC_PATH) | docker exec -i CONTAINER tar Cxf DEST_PATH -

Usar - como SRC_PATH transmite el contenido de STDIN como un archivo tar. El comando extrae el contenido del tar en el DEST_PATH del sistema de archivos del contenedor. En este caso, DEST_PATH debe especificar un directorio. Usar - como DEST_PATH transmite el contenido del recurso como un archivo tar a STDOUT.