A copiar os ficheiros da máquina para o contentor do acoplador
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?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.
-
Obter o nome do contentor ou o id do contentor curto:
$ docker ps
-
Obter identificação completa do contentor:
$ docker inspect -f '{{.Id}}' SHORT_CONTAINER_ID-or-CONTAINER_NAME
-
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
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
docker run -i ubuntu /bin/bash -c 'cat > file' < file
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
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.
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 .
Muito fácil
-
Crie um novo ficheiro dockerfile e use a imagem existente como base.
FROM myName/myImage:latest ADD myFile.py bin/myFile.py
-
Depois construir o contentor:
docker build .
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.
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.
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.
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?.
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.
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/
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.
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
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
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
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.
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".
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'.
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.
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
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.
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.
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
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.
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
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
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
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: -