A copiar os ficheiros da máquina para o contentor do acoplador

Estou a tentar construir um backup e restaurar a solução para os contentores do Docker com que trabalhamos.

tenho a imagem base do Docker que criei, {[[0]}, e não quero ter de a reconstruir de cada vez com um ficheiro do Docker para lhe adicionar ficheiros.

quero criar um programa que corra a partir da máquina anfitriã e crie um novo contentor usando a imagem do 'Docker' {[[0]} e depois copia os ficheiros para esse contentor.

Como posso copiar arquivos do host para o container?

 946
Author: Peter Mortensen, 2014-04-07

30 answers

O comando cp pode ser usado para copiar ficheiros. Um arquivo específico pode ser copiado como:

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

Para ênfase, mycontainer é umrecipiente ID, Não Umaimagem ID.

Vários ficheiros contidos na pasta src podem ser copiados para a pasta target Usando:

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

Referência: Docker CLI docs for cp

Nas versões do Docker antes de 1.8 só era possível copiar ficheiros de um contentor para a máquina. Não da máquina para um contentor.

 1626
Author: h3nrik, 2018-09-13 03:42:28
  1. Obter o nome do contentor ou o id do contentor curto:

    $ docker ps
    
  2. Obter identificação completa do contentor:

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

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

Exemplo:

$ 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

Ou

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

d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5

$ sudo cp file.txt /var/lib/docker/aufs/mnt/**d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5**/root/file.txt
 152
Author: solidleon, 2017-03-11 10:29:07

A forma mais limpa é montar uma pasta de máquinas no contentor ao iniciar o contentor:

{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
 113
Author: Ben Davis, 2018-09-05 09:20:25
O seguinte é uma maneira bastante feia de o fazer, mas funciona.
docker run -i ubuntu /bin/bash -c 'cat > file' < file
 103
Author: Erik, 2014-06-11 16:22:18

Se precisar de o fazer num contentor a correr, pode usar o docker exec (adicionado em 1.3).

Primeiro, encontra o nome ou o ID do contentor:

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

No exemplo acima podemos usar b9b7400ddd8f ou elated_hodgkin.

Se você quisesse copiar tudo em /tmp/somefiles na máquina para /var/www na embalagem:

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

Podemos então executar /bin/bash no recipiente e verificar se funcionou:

$ docker exec -it elated_hodgkin /bin/bash
root@b9b7400ddd8f:/# ls /var/www
file1  file2
 37
Author: adean, 2015-01-24 07:38:07

A solução é dada abaixo,

Da casca do ancoradouro,

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

Do hospedeiro

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

o ficheiro deve ser copiado directamente para o local onde o contentor se encontra no sistema de ficheiros.

 33
Author: pierce, 2017-09-18 12:52:43

Outra solução para copiar ficheiros para um contentor em execução é usar o tar:

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

Copia o ficheiro foo.sh em /tmp do contentor.

Editar: Remover o refuntante -f, graças ao Comentário de Maarten .

 25
Author: joemat, 2017-05-23 12:10:54

Muito fácil

  1. Crie um novo ficheiro dockerfile e use a imagem existente como base.

    FROM myName/myImage:latest
    
    ADD myFile.py bin/myFile.py
    
  2. Depois construir o contentor:

    docker build .
    
 23
Author: Rusty Shackleford, 2017-05-26 08:31:39

Para copiar um ficheiro da máquina para o contentor em execução

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

baseado na resposta do Erik e nos comentários do Mikl e do z0r.

 19
Author: Andrea, 2017-05-23 11:55:19

Com o Docker 1.8, docker cp é capaz de copiar ficheiros de máquina para contentor. Veja a publicação do Blog do Dockeranunciando Docker 1.8: confiança de conteúdo, Caixa De Ferramentas e atualizações para registro e orquestração.

 11
Author: joemat, 2017-03-11 10:35:49

Esta é uma resposta directa à questão "copiar ficheiros de máquina para Contentor de Docker" levantada nesta questão no título.

Tenta docker cp. É a maneira mais fácil de fazer isso e funciona mesmo no meu Mac. Utilização:

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

Isto irá copiar o ficheiro some-file.txt na pasta /root da sua máquina para o contentor do 'Docker' chamado some-docker-container para a pasta /root. Está muito perto da sintaxe de cópia segura. E como mostrado no post anterior, você pode usá-lo vice-versa. Ou seja, tu. também copiar arquivos do container para a máquina.

E antes de baixar este post, por favor, digite docker cp --help. Ler a documentação pode ser muito útil, às vezes... Se não gosta dessa forma e quer volumes de dados no seu contentor já criado e em funcionamento, a recreação é a sua única opção hoje. Veja Também Como posso adicionar um volume a um Contentor de Estivador existente?.
 11
Author: Hiro.Protagonist, 2017-05-23 12:10:54

Assumindo que o contentor já está em execução, escreva o comando indicado:

# cat /path/to/host/file/ | docker exec -i -t <container_id> bash -c "/bin/cat > /path/to/container/file"

Para partilhar ficheiros com a pasta partilhada, execute o contentor escrevendo o comando indicado:

# docker run -v /path/to/host/dir:/path/to/container/dir ...

Nota: podem surgir problemas com as permissões, uma vez que os utilizadores do contentor não são os mesmos que os utilizadores do servidor.

 7
Author: johndodo, 2017-09-19 14:46:26

Num ambiente docker, todos os contentores são encontrados no directório:

/var/lib/docker/aufs/required-docker-id/

Para copiar a pasta/ficheiro de código para qualquer parte do contentor, escreva o comando indicado:

sudo cp -r mydir/ /var/lib/docker/aufs/mnt/required-docker-id/mnt/

 6
Author: aabdulwahed, 2017-09-19 14:30:55

Para copiar ficheiros / pastas entre um contentor e o sistema de ficheiros local, escreva o comando:

docker cp {SOURCE_FILE} {DESTINATION_CONTAINER_ID}:/{DESTINATION_PATH}

Por exemplo,

docker cp /home/foo container-id:/home/dir

Para obter o id do contianer, escreva o comando indicado:

docker ps

O Conteúdo acima é retirado de docker.com.

 6
Author: prayagupd, 2017-09-19 15:29:36

tar e docker cp são uma boa combinação para copiar tudo num directório.

Criar um recipiente de volume de dados

docker create --name dvc --volume /path/on/container cirros

Para preservar a hierarquia de directórios

tar -c -C /path/on/local/machine . | docker cp - dvc:/path/on/container

Verifique o seu trabalho

docker run --rm --volumes-from dvc cirros ls -al /path/on/container
 4
Author: Everett Toews, 2016-05-09 18:39:50
Pode localizar o endereço IP da sua máquina local usando
ifconfig

Depois, basta entrar no seu contentor e tipo

scp user_name@ip_address:/path_to_the_file destination

De qualquer forma, se não tiver um cliente e servidor SSH instalado, basta instalá-lo usando:

sudo apt-get install openssh-server
 4
Author: Harshit Anand, 2017-03-11 10:34:42

Eu tentei a maioria das soluções (upvoted) aqui, mas no docker 17.09 (em 2018) não há mais /var/lib/docker/aufs pasta.

Este simples docker cp resolveu esta tarefa.

docker cp c:\path\to\local\file container_name:/path/to/target/dir/
Como obter o nome do contentor? (Existe uma secção NAMES. Não utilize IMAGE.)
 docker ps 
 4
Author: Aaron, 2018-01-17 21:18:54

Muitos que encontram esta questão podem realmente ter o problema de copiar arquivos para uma imagem do Docker enquanto está sendo criado (eu fiz).

Nesse caso, pode usar o comando {[[0]} no Dockerfile que usa para criar a imagem.

Ver a documentação.

 3
Author: Klas Mellbourn, 2017-03-11 10:33:34

Se o hospedeiro é CentOS ou Fedora, há um proxy não em /var/lib/docker/aufs, mas está sob /proc:

cp -r /home/user/mydata/* /proc/$(docker inspect --format "{{.State.Pid}}" <containerid>)/root

Este cmd irá copiar todo o conteúdo de data directório para / do contentor com o id "containerid".

 3
Author: Abdennour TOUMI, 2017-03-11 10:38:58

A melhor maneira de copiar os ficheiros para o contentor que encontrei é montar uma pasta na máquina, usando a opção -v do comando de execução do 'docker'.

 2
Author: Prakash Varandani, 2015-06-22 15:04:49
Há boas respostas, mas muito específicas. Descobri que é uma boa maneira de obter a identificação do contentor que lhe interessa. Então faça
mount | grep <id>

Para ver onde está montado o volume. Isso é

/var/lib/docker/devicemapper/mnt/<id>/rootfs/
Para mim, mas pode ser um caminho diferente, dependendo do SO e da configuração. Agora simplesmente copie arquivos para esse caminho.

Usar -v nem sempre é prático.

 2
Author: akostadinov, 2017-03-11 10:31:47

Simplesmente copio o ficheiro directamente de onde o contentor está localizado a partir da máquina anfitriã.

Por exemplo:

Primeiro descubra o ID do contentor:

root@**3aed62678d54**:/home#
E depois, a partir da máquina, digamos que o ficheiro está na pasta pessoal:
root@saasdock:/home/dnepangue# cp cheering_nasa.gif /var/lib/docker/aufs/mnt/**3aed62678d54**a5df47a4a00a58bb0312009c2902f8a37498a1427052e8ac454b/home/
Voltem para o contentor...
root@**3aed62678d54**:/home# ls cheering_nasa.gif
 1
Author: asterinux, 2017-03-11 10:27:19

Se usar o Windows como máquina, poderá usar o WinSCP para se ligar ao 'Docker' e transferir ficheiros através da interface gráfica.

Se no Linux, o comando scp também funcionaria através do terminal.

 1
Author: R.K, 2017-03-11 10:43:53
Este é um onliner para copiar um único arquivo enquanto executa um container tomcat.
docker run -v /PATH_TO_WAR/sample.war:/usr/local/tomcat/webapps/myapp.war -it -p 8080:8080 tomcat

Isto irá copiar o ficheiro war para o directório webapps e pôr a sua aplicação a funcionar num instante.

 1
Author: karthik101, 2017-10-24 12:53:05

No caso de não ser claro para alguém como eu o que {[[1]} na resposta @h3nrik significa, é na verdade o ID do contentor. Para copiar um ficheiro WarpSquare.mp4 em /app/example_scenes/1440p60 de um contentor do acoplador saído para a pasta actual, usei isto.

docker cp `docker ps -q -l`:/app/example_scenes/1440p60/WarpSquare.mp4 .

Onde {[[4]} mostra a identificação do contentor da última instância que saiu. No caso de não ser um contentor saído, pode obtê-lo por docker container ls ou docker ps

 1
Author: ishandutta2007, 2018-08-08 06:49:14

Se não tiver uma pasta definida como um volume no ficheiro do Dockerfile, o /var/lib/docker/aufs/mnt// / irá funcionar. Mas há casos em que o diretório dentro do recipiente é definido como um volume. Neste caso, o conteúdo sob aufs/mnt/* e o conteúdo visto pelo recipiente são diferentes.

Terá de inspeccionar o contentor usando a inspecção docker e, em seguida, procurar os volumes. Lá você encontrará uma menção para algo como /var/lib/docker/vfs/dir / fe940b... (a ID). Terá de adicionar/modificar os ficheiros aqui em vez de no aufs/mnt/*.

A parte confusa é que os ficheiros também aparecem em /aufs/mnt/*. Passei algum tempo a coçar a cabeça porque as mudanças aqui não funcionavam para mim. Espero que isto ajude alguém.

 0
Author: user3392439, 2014-09-28 10:40:00

O meu método favorito:

Recipientes:

CONTAINER_ID=$(docker ps | grep <string> | awk '{ print $1 }' | xargs docker inspect -f '{{.Id}}')

Ficheiro.txt

mv -f file.txt /var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/root/file.txt

Ou

mv -f file.txt /var/lib/docker/aufs/mnt/$CONTAINER_ID/rootfs/root/file.txt
 0
Author: user3159411, 2015-01-16 02:59:07

Eu montava e executava a imagem com um servidor, qualquer um como indicado aqui;

docker run -d -v /blah1/blah2:/mnt --name mntcontainer ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

Depois

docker exec -it mntcontainer bash
 0
Author: East2West, 2016-01-31 23:42:44

Outra solução é usar o velho bom scp. Isto é útil no caso de você precisar copiar um diretório.

A partir da execução do seu hospedeiro:

scp FILE_PATH_ON_YOUR_HOST IP_CONTAINER:DESTINATION_PATH
scp foo.txt 172.17.0.2:foo.txt

No caso de ser necessário copiar uma pasta:

scp -r DIR_PATH_ON_YOUR_HOST IP_CONTAINER:DESTINATION_PATH
scp -r directory 172.17.0.2:directory

Certifique-se de instalar também o ssh no seu contentor.

apt-get install openssh-server
 0
Author: gaetano, 2016-08-29 11:34:13
Uma coisa que tentei e resultou.

Assim que rodar o seu contentor e criar QUALQUER ficheiro por baixo desse contentor, poderá aceder facilmente a esse ficheiro a partir do local da sua máquina de atracar: -

Cd / var/lib/docker/aufs/containers/container_id / tmp

Tenta uma vez!
 0
Author: Harshal Vaidya, 2017-08-02 10:00:21