# docker container cp

**Descripción:** Copia archivos o carpetas entre un contenedor y el sistema de archivos local

**Uso:** `docker 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ón                                                        | Predeterminado                                        | Descripción                                                                                                                                    |
| ------------------------------------------------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|  | `-a`, `--archive` |  |  Modo de archivo (copia toda la información de uid/gid) |

 | `-L`, `--follow-link` |  |  Sigue siempre los enlaces simbólicos en SRC_PATH |

 | `-q`, `--quiet` |  |  Suprime la salida del progreso durante la copia. La salida del progreso se suprime automáticamente si no hay una terminal conectada<br> |




## Ejemplos

Copiar un archivo local en el contenedor

```console
$ docker cp ./some_file CONTAINER:/work
```

Copiar archivos desde el contenedor a la ruta local

```console
$ 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

```console
$ 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](/reference/cli/docker/container/run/#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):

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

```console
$ 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`.



