Estou pensando em usar o Docker para criar minhas dependências em um servidor de Integração Contínua (CI), para que eu não precise instalar todos os tempos de execução e bibliotecas nos próprios agentes.
Para conseguir isso, eu precisaria copiar os artefatos de construção que são criados dentro do contêiner de volta para o host. Isso é possível?
docker
docker-container
file-copying
user2668128
fonte
fonte
Respostas:
Para copiar um arquivo de um contêiner para o host, você pode usar o comando
Aqui está um exemplo:
Aqui goofy_roentgen é o nome do contêiner que obtive do seguinte comando:
Você também pode usar (parte) o ID do contêiner . O comando a seguir é equivalente ao primeiro
fonte
docker ps -alq
.docker cp ...
docker cp -L
copiar links simbólicosVocê não precisa usar
docker run
.Você pode fazer isso com
docker create
.Dos documentos :
Então, você pode fazer:
Aqui, você nunca inicia o contêiner. Isso me pareceu benéfico.
fonte
-ti
obrigatório ebash
obrigatório?Monte um "volume" e copie os artefatos para lá:
Então, quando a construção terminar e o contêiner não estiver mais em execução, ele já terá copiado os artefatos da construção para o
artifacts
diretório no host.Editar
Advertência: Ao fazer isso, você pode ter problemas com o ID do usuário do docker que corresponde ao ID do usuário atual. Ou seja, os arquivos
/artifacts
inseridos serão mostrados como pertencentes ao usuário com o UID do usuário usado dentro do contêiner do docker. Uma maneira de contornar isso pode ser usar o UID do usuário que está chamando:fonte
chown
comando para corresponder ao ID do usuário e ao ID do grupo na máquina host.Monte um volume, copie os artefatos, ajuste a identificação do proprietário e a identificação do grupo:
fonte
TLDR;
Descrição
docker run
com um volume do host,chown
o artefato,cp
o artefato no volume do host:Esse truque funciona porque a
chown
invocação no heredoc leva$(id -u):$(id -g)
valores de fora do contêiner em execução; ou seja, o host do docker.Os benefícios são:
docker container run --name
oudocker container create --name
antesdocker container rm
depoisfonte
cp
e respostas baseadas em volume. Além disso, para oid
truque para a posse, que é uma verdadeira dor de cabeça às vezesA maioria das respostas não indica que o contêiner deve ser executado antes
docker cp
que funcione:fonte
Windows Hyper-V
, parece que é necessário para parar recipiente antes de copiar um arquivo .Se você não possui um contêiner em execução, apenas uma imagem e supondo que deseja copiar apenas um arquivo de texto, você pode fazer algo assim:
fonte
Estou postando isso para qualquer pessoa que esteja usando o Docker para Mac. Isto é o que funcionou para mim:
Note que quando eu monto usando
-v
issobackup
diretório é criado automaticamente.Espero que isso seja útil para alguém algum dia. :)
fonte
volumes
comando na raiz do config.yml, para que os volumes sejam acessíveis por vários contêineres.Se você deseja apenas extrair um arquivo de uma imagem (em vez de um contêiner em execução), faça o seguinte:
docker run --rm <image> cat <source> > <local_dest>
Isso abrirá o contêiner, escreva o novo arquivo e remova o contêiner. Uma desvantagem, no entanto, é que as permissões de arquivo e a data de modificação não serão preservadas.
fonte
https://docs.docker.com/engine/reference/commandline/run/ https://docs.docker.com/engine/reference/commandline/cp/
fonte
Com o lançamento do Docker 19.03, você pode pular a criação do contêiner e até criar uma imagem. Existe uma opção com builds baseadas no BuildKit para alterar o destino da saída. Você pode usar isso para gravar os resultados da compilação no diretório local, e não em uma imagem. Por exemplo, aqui está uma compilação de um binário go:
No Dockerfile acima, estou construindo o
artifact
estágio que inclui apenas os arquivos que quero exportar. E o--output
sinalizador recém-introduzido permite que eu os escreva em um diretório local em vez de em uma imagem. Isso precisa ser executado com o mecanismo BuildKit que acompanha a versão 19.03:Após a conclusão da construção, o
app
binário foi exportado:O Docker tem outras opções para o
--output
sinalizador documentado em seu repo BuildKit upstream: https://github.com/moby/buildkit#outputfonte
Como uma solução mais geral, há um plug-in do CloudBees para o Jenkins construir dentro de um contêiner do Docker . Você pode selecionar uma imagem para usar em um registro do Docker ou definir um Dockerfile para criar e usar.
Ele montará a área de trabalho no contêiner como um volume (com usuário apropriado), configurará como seu diretório de trabalho, executará os comandos solicitados (dentro do contêiner). Você também pode usar o plug-in docker-workflow (se preferir código à interface do usuário) para fazer isso, com o comando image.inside () {}.
Basicamente, tudo isso, inserido no servidor de CI / CD e mais.
fonte
Eu usei o PowerShell (Admin) com este comando.
Exemplo
fonte
Outra boa opção é criar o contêiner e executá-lo usando o sinalizador -c com o interpretador de shell para executar algumas vírgulas
O comando acima faz isso:
-Eu = executa o contêiner no modo interativo
--rm = removeu o contêiner após a execução.
-v = compartilhou uma pasta como volume do caminho do host para o caminho do contêiner.
Finalmente, o / bin / sh -c permite introduzir um comando como parâmetro e esse comando copiará os arquivos de trabalhos de casa para o caminho do contêiner.
Espero que esta resposta adicional possa ajudá-lo
fonte
Crie um diretório de dados no sistema host (fora do contêiner) e monte-o em um diretório visível de dentro do contêiner. Isso coloca os arquivos em um local conhecido no sistema host e facilita o acesso às ferramentas e aplicativos no sistema host.
fonte
Crie um caminho para o qual você deseja copiar o arquivo e use:
fonte
Você pode usar em
bind
vez de,volume
se desejar montar apenas uma pasta, não criar armazenamento especial para um contêiner:Crie sua imagem com a tag:
docker build . -t <image>
Execute sua imagem e vincule o diretório $ (pwd) atual onde app.py armazena e mapeie-o para / root / example / dentro de seu contêiner.
docker run --mount type=bind,source="$(pwd)",target=/root/example/ <image> python app.py
fonte
Isso também pode ser feito no SDK, por exemplo, python. Se você já possui um contêiner, pode procurar o nome pelo console (
docker ps -a
). O nome parece ser uma concatenação de um cientista e um adjetivo (por exemplo, "relaxing_pasteur").Confira
help(container.get_archive)
:Então, algo assim sairá do caminho especificado (/ saída) no contêiner para a máquina host e descompactará o alcatrão.
fonte