Criei um contêiner -d
para que não seja interativo.
docker run -d shykes/pybuilder bin/bash
Vejo que o contêiner saiu:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d6c45e8cc5f0 shykes/pybuilder:latest "bin/bash" 41 minutes ago Exited (0) 2 seconds ago clever_bardeen
Agora eu gostaria de executar comandos ocasionais na máquina e sair. Apenas para obter a resposta.
Eu tentei ligar a máquina. Eu tentei anexar. Eu pensei que poderia ligar run
com um contêiner, mas isso não parece ser permitido. Usar start
apenas parece funcionar e depois existe rapidamente.
Gostaria de voltar ao modo interativo depois de sair.
Eu tentei:
docker attach d6c45e8cc5f0
Mas eu entendo:
2014/10/01 22:33:34 You cannot attach to a stopped container, start it first
Mas se eu iniciar, ele sai de qualquer maneira. Catch 22. Eu não posso ganhar.
docker container ls -a
Respostas:
Em outubro de 2014, a equipe
docker exec
do Docker introduziu o comando : https://docs.docker.com/engine/reference/commandline/exec/Portanto, agora você pode executar qualquer comando em um contêiner em execução apenas sabendo seu ID (ou nome):
Observe que o
exec
comando funciona apenas no contêiner já em execução. Se o contêiner estiver parado no momento, você deve primeiro executá-lo com o seguinte comando:A coisa mais importante aqui é a
-d
opção, que significadetached
. Isso significa que o comando que você forneceu inicialmente ao contêiner (/bin/bash
) será executado em segundo plano e o contêiner não será interrompido imediatamente .fonte
CDR LDN
paracdrev
a resposta abaixo ( stackoverflow.com/a/26181666/149428 ).-it
?Seu contêiner será fechado quando o comando que você deu terminar. Use as seguintes opções para mantê-lo ativo:
-i
Mantenha o STDIN aberto, mesmo que não esteja conectado.-t
Aloque um pseudo-TTY.Portanto, seu novo
run
comando é:Se você deseja anexar a um contêiner já em execução:
Nestes exemplos
/bin/bash
é usado como o comando.fonte
docker exec -it CONTAINER_ID /bin/bash -c "export VAR=1 && echo $VAR"
Variável vazia tentada e impressa (esperada1
). o que estou perdendo?-it
não estará disponível.Então, acho que a resposta é mais simples do que muitas respostas enganosas acima.
Para iniciar um contêiner existente que está parado
Para parar um contêiner em execução
Em seguida, faça login no shell interativo de um contêiner
Para iniciar um contêiner existente e anexá-lo a um comando
Cuidado, isso irá parar o contêiner na saída. Mas, em geral, você precisa iniciar o contêiner, anexá-lo e pará-lo após concluir.
fonte
Para expandir a resposta do katrmr, se o contêiner estiver parado e não puder ser iniciado devido a um erro, você precisará
commit
dele em uma imagem. Então você pode iniciar o bash na nova imagem:fonte
dshell
a fazê-lo automaticamente em uma variedade de situações - github.com/avirshup/docker-cli-sugarAlgumas das respostas aqui são enganosas porque dizem respeito a contêineres em execução, e não parados.
Sven Dowideit explicou no fórum do Docker que os contêineres estão vinculados ao seu processo (e o Docker não pode alterar o processo de um contêiner parado, aparentemente devido pelo menos à sua estrutura interna: https://github.com/docker/docker/issues / 1437 ). Então, basicamente, a única opção é
commit
o contêiner para uma imagem erun
com um comando diferente.Consulte https://forums.docker.com/t/run-command-in-stopped-container/343
(acredito que a
ENTRYPOINT
abordagem " com argumentos" também não funcionaria, pois você ainda não seria capaz de alterar o argumentos para um contêiner parado.)fonte
bin/bash
sem-it
alterar nada no contêiner, portanto, confirmar isso não é realmente necessário e o CDR LDN fornece a resposta certa para a situação específica do OP. Ainda assim,commit
é a resposta para o problema técnico de como alterar o processo de contêiner.Eu tive que usar o bash -c para executar meu comando:
docker exec -it CONTAINER_ID bash -c "mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql"
fonte
Criando um contêiner e enviando comandos para ele, um por um:
fonte
Esta é uma resposta combinada que criei usando a resposta CDR LDN acima e a resposta que encontrei aqui .
O exemplo a seguir inicia um contêiner do Arch Linux a partir de uma imagem e é instalado
git
nesse contêiner usando apacman
ferramenta:Isso é tudo.
fonte
Se você estiver tentando executar o shell script, precisará executá-lo como bash.
fonte
Canalize um comando para stdin
É necessário remover o
-t
para que ele funcione:Isso pode ser mais conveniente do que usar as opções da CLI algumas vezes.
Testado com:
depois em outro shell:
Em seguida, no primeiro shell:
Testado no host do Docker 1.13.1, Ubuntu 16.04.
fonte
Supondo que a imagem esteja usando o ponto de entrada padrão
/bin/sh -c
, a execução/bin/bash
será encerrada imediatamente no modo daemon (-d
). Se você deseja que esse contêiner execute um shell interativo, use em-it
vez de-d
. Se você deseja executar comandos arbitrários em um contêiner que normalmente executa outro processo, tentensenter
ounsinit
. Consulte https://blog.codecentric.de/en/2014/07/enter-docker-container/ para obter detalhes.fonte
Infelizmente, é impossível substituir
ENTRYPOINT
argumentos comdocker run --entrypoint
para atingir esse objetivo.fonte
Gostaria de observar que a resposta principal é um pouco enganadora.
O problema com a execução
docker run
é que um novo contêiner é criado sempre. No entanto, há casos em que gostaríamos de revisitar contêineres antigos ou não ocupar espaço com novos contêineres.(Dado
clever_bardeen
é o nome do contêiner criado ...)No caso do OP, verifique se a imagem do docker está sendo executada executando o seguinte comando:
Em seguida, execute o contêiner do docker usando o seguinte comando:
fonte
Para Mac:
se você deseja se conectar como usuário root:
fonte
Resposta simples: inicie e anexe ao mesmo tempo. Nesse caso, você está fazendo exatamente o que pediu.
certifique-se de mudar
<CONTAINER_ID/CONTAINER_NAME>
fonte
Ex:
fonte
Estou executando o contêiner do Windows e preciso procurar dentro do contêiner do docker arquivos e pastas criados e copiados.
Para fazer isso, usei o seguinte comando docker entrypoint para obter o prompt de comando em execução dentro do contêiner ou anexá-lo ao contêiner.
Isso me ajudou a anexar o prompt de comando ao contêiner e a manter o contêiner ativo. :)
fonte
Uma maneira rápida de retomar e acessar o contêiner encerrado mais recentemente:
fonte
Eu costumo usar isso:
para interagir continuamente com um contêiner em execução.
fonte