Minha pergunta está relacionada a esta questão sobre como copiar arquivos de contêineres para hosts; Eu tenho um Dockerfile que busca dependências, compila um artefato de compilação da fonte e executa um executável. Também quero copiar o artefato de construção (no meu caso, é .zip
produzido por sbt dist
em '../ target / `, mas acho que esta questão também se aplica a jars, binários, etc.
docker cp
funciona em contêineres, não em imagens; eu preciso iniciar um contêiner apenas para obter um arquivo dele? Em um script, tentei executar /bin/bash
no modo interativo em segundo plano, copiando o arquivo e, em seguida, encerrando o contêiner, mas isso parece confuso. Existe uma maneira melhor?
Por outro lado, gostaria de evitar descompactar um .tar
arquivo depois de executar docker save $IMAGENAME
apenas para retirar um arquivo (mas essa parece ser a opção mais simples, embora a mais lenta agora).
Eu usaria volumes do docker, por exemplo:
docker run -v hostdir:out $IMAGENAME /bin/cp/../blah.zip /out
mas estou executando boot2docker
em OSX e não sei como escrever diretamente no meu sistema de arquivos host mac (volumes de leitura e gravação estão montados dentro da minha VM boot2docker, o que significa que não posso compartilhar facilmente um script para extrair blah.zip
de uma imagem com outros. Pensamentos?
fonte
create
comando adicionado / removido (não está presente no 1.01)docker create
foi apresentado no docker 1.3, blog.docker.com/2014/10/…docker cp $id:path > local-tar-file
funcionou perfeitamente.Infelizmente, não parece haver uma maneira de copiar arquivos diretamente das imagens do Docker. Você precisa primeiro criar um contêiner e, em seguida, copiar o arquivo do contêiner.
No entanto, se sua imagem contiver um
cat
comando (e fará em muitos casos), você pode fazê-lo com um único comando:Caso sua imagem não contenha
cat
, basta criar um container e usar odocker cp
comando conforme sugerido na resposta de Igor.fonte
Uma opção muito mais rápida é copiar o arquivo do contêiner em execução para um volume montado:
** VS **
fonte
cat a >b
vscp a b
têm tempos semelhantes aos mostrados aqui. Além disso, se o caminho de origem e o caminho de destino residirem em sistemas de arquivos diferentes, ambos os exemplos levarão a uma cópia byte a byte completa.O comentário dos pais já mostrou como usar o gato . Você também pode usar o alcatrão de maneira semelhante:
fonte
docker run --rm --entrypoint tar _image_ cC _img_directory_ . | tar xvC _host_directory_
queria fornecer uma solução de uma linha
editar: o contêiner nem precisa ser executado nesta solução
fonte
Outra (curta) resposta para este problema:
fonte
Estou usando boot2docker no MacOS. Posso garantir que os scripts baseados em "docker cp" são portáteis. Porque qualquer comando é retransmitido dentro do boot2docker, mas o fluxo binário é retransmitido de volta para o cliente da linha de comando do docker em execução no seu mac. Portanto, as operações de gravação do cliente docker são executadas dentro do servidor e gravadas de volta na instância do cliente em execução!
Estou compartilhando um script de backup para volumes do docker com qualquer contêiner do docker que forneço e meus scripts de backup são testados no Linux e no MacOS com boot2docker. Os backups podem ser facilmente trocados entre plataformas. Basicamente, estou executando o seguinte comando dentro do meu script:
Já movi os arquivos entre o contêiner linux e meu contêiner mac sem nenhum ajuste no script de backup ou restauração. Se é isso que você quer, você encontra o script completo em um tutorial aqui: blacklabelops / jenkins
fonte
Você pode vincular um caminho local no host a um caminho no contêiner e, em seguida,
cp
os arquivos desejados a esse caminho no final do seu script.Então, não há necessidade de copiar depois.
fonte