Estou tentando criar uma solução de backup e restauração para os contêineres do Docker com os quais trabalhamos.
Eu tenho a imagem base do Docker que criei ubuntu:base
e não quero reconstruí-la sempre com um arquivo do Docker para adicionar arquivos a ele.
Quero criar um script que seja executado na máquina host e crie um novo contêiner usando a ubuntu:base
imagem do Docker e copie os arquivos para esse contêiner.
Como posso copiar arquivos do host para o contêiner?
docker
docker-container
user3001829
fonte
fonte
Respostas:
O
cp
comando pode ser usado para copiar arquivos.Um arquivo específico pode ser copiado para o contêiner, como:
Um arquivo específico pode ser copiado do contêiner, como:
Para dar ênfase,
mycontainer
é um ID de contêiner , não um ID de imagem .Vários arquivos contidos na pasta
src
podem ser copiados para atarget
pasta usando:Referência: documentos da CLI do Docker para
cp
Nas versões do Docker anteriores à 1.8, só era possível copiar arquivos de um contêiner para o host. Não do host para um contêiner.
fonte
COPY
prefereADD
quando aplicável.docker cp
para copiar do contêiner para o host funciona bem, mas quando usá-lo para copiar arquivos do host para o contêiner, sem efeito ... alguém sabe por quê? versão do docker: Docker versão 1.10.3, compilação cb079f6-sem suporteObter nome do container ou ID curto do container:
Obter código completo do contêiner:
Copiar arquivo:
EXEMPLO:
ou
fonte
aufs
apenas adevicemapper
. A maneira mais fácil de verificar o caminho de montagem dos contêineres (enquanto está em execução) é executar o comandomount
./var/lib/docker/aufs/diff/<id>/
/var/lib
para mim.find / -name docker
também não foi útil.A maneira mais limpa é montar um diretório de host no contêiner ao iniciar o contêiner:
fonte
docker run -d -p -v /host/path:/mnt --name container_name image_name
docker cp
seja uma operação de mão única!A seguir, é uma maneira bastante feia de fazê-lo, mas funciona.
fonte
docker commit `docker ps -l -q` ubuntu-with-file
. Então a mudança será perdido (use o nome que você quer em vez deubuntu-with-file
)docker exec
recurso para trabalhar com contêiner em execução:docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/
docker exec -i ...
vez de-it
, porque não há TTY ao canalizar de um arquivo.tar -c -v -f - /path/to/host/directory | docker exec -i <container-name> bash -c 'tar -x -v --strip-components 1 -f - -C /path/to/container/directory'
Se você precisar fazer isso em um contêiner em execução, poderá usar o docker exec (adicionado em 1.3).
Primeiro, encontre o nome ou o ID do contêiner:
No exemplo acima, podemos usar
b9b7400ddd8f
ouelated_hodgkin
.Se você deseja copiar tudo no
/tmp/somefiles
host para/var/www
o contêiner:Podemos então executar
/bin/bash
no contêiner e verificar se funcionou:fonte
Crie um novo dockerfile e use a imagem existente como sua base.
Em seguida, construa o contêiner:
fonte
A solução é dada abaixo,
No shell do Docker,
Do host
O arquivo deve ser copiado diretamente para o local em que o contêiner fica no sistema de arquivos.
fonte
Normalmente, existem três tipos:
De um contêiner para o host
Do host para um contêiner
De um contêiner para um contêiner, mistura 1 e 2
fonte
Outra solução para copiar arquivos em um contêiner em execução é usar tar:
Copia o arquivo
foo.sh
no/tmp
contêiner.Edit: Remove reduntant
-f
, graças ao comentário de Maarten .fonte
-f -
é um pouco redundante, porém, o comportamento padrão é escrever para stdout de qualquer maneira.Para copiar um arquivo do host para o contêiner em execução
Com base na resposta de Erik e nos comentários de Mikl e z0r.
fonte
Com o Docker 1.8,
docker cp
é possível copiar arquivos do host para o contêiner. Consulte a publicação no blog do Docker Anunciando o Docker 1.8: Confiança, caixa de ferramentas e atualizações de conteúdo no registro e orquestração .fonte
docker cp foo.txt mycontainer:/foo.txt
Esta é uma resposta direta à pergunta 'Copiando arquivos do host para o contêiner do Docker' levantada nesta pergunta no título.
Tente
docker cp
. É a maneira mais fácil de fazer isso e funciona mesmo no meu Mac. Uso:Isso copiará o arquivo
some-file.txt
no diretório/root
da máquina host para o contêiner do Docker nomeadosome-docker-container
no diretório/root
. Está muito próximo da sintaxe da cópia segura. E, como mostrado no post anterior, você pode usá-lo vice-versa. Ou seja, você também copia arquivos do contêiner para o host.E antes de fazer o link desta postagem, digite
docker cp --help
. A leitura da documentação pode ser muito útil, às vezes ...Se você não gosta dessa maneira e deseja volumes de dados em seu contêiner já criado e em execução, a recreação é sua única opção hoje. Consulte também Como posso adicionar um volume a um contêiner do Docker existente? .
fonte
Tentei a maioria das soluções (aprovadas) aqui, mas no docker 17.09 (em 2018) não há mais a pasta / var / lib / docker / aufs.
Este simples
docker cp
resolveu esta tarefa.Como obter container_name?
Há uma
NAMES
seção. Não use aIMAGE
.fonte
Para copiar arquivos / pastas entre um contêiner e o sistema de arquivos local, digite o comando:
Por exemplo,
Para obter o ID do contianer, digite o comando fornecido:
O conteúdo acima é retirado do docker.com .
fonte
Supondo que o contêiner já esteja em execução, digite o comando fornecido:
Para compartilhar arquivos usando o diretório compartilhado, execute o contêiner digitando o comando fornecido:
Nota: Podem surgir problemas com as permissões, pois os usuários do contêiner não são iguais aos usuários do host.
fonte
docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/
cat
não será encerrado quando sair. Se isso for importante para você (se você estiver copiando scripts bash, o bash se recusará a executá-los), você deve executarlsof | grep yourfilename
e interromper ocat
processo que contém o referido arquivo.kill $(lsof | grep /path/to/file | sed ...)
. Serei grato por sua ajuda.kill $(docker top CONTAINERNAME | sed -n '/cat$/p' | sed 's/^root[^0-9]\+\([0-9]\+\).*$/\1/')
Este é o comando para copiar dados do Docker para o Host:
Abaixo está o comando para copiar dados do host para a janela de encaixe:
fonte
Em um ambiente de docker, todos os contêineres são encontrados no diretório:
/var/lib/docker/aufs/required-docker-id/
Para copiar o diretório / arquivo de origem para qualquer parte do contêiner, digite o comando fornecido:
sudo cp -r mydir/ /var/lib/docker/aufs/mnt/required-docker-id/mnt/
fonte
tar
edocker cp
são uma boa combinação para copiar tudo em um diretório.Crie um contêiner de volume de dados
Para preservar a hierarquia de diretórios
Verifique seu trabalho
fonte
Se o host for CentOS ou Fedora, existe um proxy NOT in
/var/lib/docker/aufs
, mas está abaixo de/proc
:Este cmd copiará todo o conteúdo do
data
diretório para o/
container com o ID "containerid".fonte
/proc
). Também estenda o caminho para colocar o arquivo em outro lugar, não apenas o root.Caso não esteja claro para alguém como eu o que
mycontainer
na resposta @ h3nrik significa, na verdade, é o ID do contêiner. Para copiar um arquivoWarpSquare.mp4
em/app/example_scenes/1440p60
partir de um recipiente janela de encaixe saiu a pasta atual eu usei isso.onde
docker ps -q -l
puxa o ID do contêiner da última instância encerrada. Caso não seja um contêiner encerrado, você pode obtê-lodocker container ls
oudocker ps
fonte
docker ps -a
oudocker container ls -a
.Muitos que encontram essa pergunta podem realmente ter o problema de copiar arquivos em uma imagem do Docker enquanto ela está sendo criada (eu fiz).
Nesse caso, você pode usar o
COPY
comandoDockerfile
usado para criar a imagem.Veja a documentação .
fonte
Você pode apenas rastrear o endereço IP da sua máquina local usando
Em seguida, basta entrar no seu contêiner Docker e digite
De qualquer forma, se você não tiver um cliente e servidor SSH instalado, basta instalá-lo usando:
fonte
Este é um onliner para copiar um único arquivo enquanto executa um contêiner de tomcat.
Isso copiará o arquivo war para o diretório webapps e fará com que seu aplicativo seja executado rapidamente.
fonte
Sintaxe de Container Up:
Na janela de encaixe Arquivo
fonte
A melhor maneira de copiar arquivos para o contêiner que encontrei é montar um diretório no host usando a
-v
opção do comando docker run.fonte
Existem boas respostas, mas muito específicas. Descobri que
docker ps
é uma boa maneira de obter o ID do contêiner de seu interesse.para ver onde o volume está montado. Isso é
para mim, mas pode ser um caminho diferente, dependendo do sistema operacional e da configuração. Agora simplesmente copie os arquivos para esse caminho.
O uso
-v
nem sempre é prático.fonte
Comecei a usar o docker para compilar o VLC. Aqui está o que você pode fazer para copiar arquivos de um lado para outro dos contêineres:
Procure um arquivo familiar nesse txt e você terá a pasta, o cd como root e pronto! copie tudo o que quiser.
Pode haver um caminho com "mesclado", acho que você quer o caminho com "diff".
Além disso, se você sair do contêiner e quiser voltar ao ponto em que parou:
Eu acho que é útil quando você não nomeou nada com um comando como
Claro que o método hacker, mas e daí?
fonte
Por exemplo, quero copiar meu arquivo xxxx / download / jenkins para o tomcat
Começo a obter o ID do contêiner Tomcat
fonte
Meu método favorito:
RECIPIENTES:
file.txt
ou
fonte
Na minha opinião, você não precisa copiar arquivos dentro da imagem, mas pode usar GIT ou SVN para seus arquivos e definir um volume sincronizado com uma pasta local. Use um script ao executar o contêiner, que pode verificar se os dados já existem na pasta local, se não os copiar do repositório GIT. Isso torna sua imagem muito leve.
fonte