Eu tenho um contêiner que está executando o serviço Apache em primeiro plano. Eu gostaria de poder acessar o contêiner de outro shell para "bisbilhotar" dentro dele e examinar os arquivos. No momento, se eu conectar ao contêiner, fico olhando para o daemon Apache e não consigo executar nenhum comando.
É possível anexar outro tty a um contêiner em execução? Possivelmente, posso tirar proveito do fato de o Docker estar apenas envolto em contêineres LXC? Eu tentei, sudo lxc-console -n [container-id] -t [1-4]
mas parece que apenas um tty é disponibilizado e esse é o que executa o daemon apache. Talvez haja uma maneira de ativar vários consoles lxc durante a compilação?
Prefiro não configurar e criar o contêiner com um serviço openssh, se possível.
docker attach [conainer-id]
?Respostas:
Com a janela de encaixe 1.3, há um novo comando
docker exec
. Isso permite que você insira uma janela de encaixe em execução:fonte
exec
não atua como um terminal normal. Por exemplo, você não pode alterar o usuário uma vez dentro do contêiner.su someuser
mudar de usuário. Executando o Docker 1.4.1docker exec -it
acabará por fornecer uma tty pseudo totalmente funcional, mas por agora (Docker versão 1.9.1), há algumas limitações: github.com/docker/docker/issues/8755Você deve usar a ferramenta de Jérôme Petazzoni chamada 'nsenter' para inserir um contêiner sem usar o SSH. Consulte: https://github.com/jpetazzo/nsenter
Instale simplesmente executando:
docker run -v /usr/local/bin:/target jpetazzo/nsenter
Em seguida, use o comando
docker-enter <container-id>
para inserir o contêiner.fonte
docker exec
. Isso permite que você digite uma janela de encaixe em execução:docker exec -it <container-id> bash
(ver minha resposta abaixo)docker-enter
ainda existe? Isso me dácommand not found
.Atualizar
A partir do docker 0.9, para que as etapas abaixo funcionem agora, é necessário atualizar o
/etc/default/docker
arquivo com a'-e lxc'
opção de inicialização do daemon do docker antes de reiniciar o daemon (eu fiz isso reinicializando o host).Isso é tudo porque ...
fonte
Observe que isso impedirá que o novo recurso opcional de rede do docker 0.11 do " host " funcione e você verá apenas a interface de loopback. relatório de erro
Acontece que a solução para uma pergunta diferente também foi a solução para esta:
Atualização: em breve você precisará usar, e
ps --no-trunc
não ops -notrunc
que está sendo preterido.Encontre o ID completo do contêiner
Digite o comando lxc attach.
O topo mostra meu processo apache executando a janela de encaixe iniciada.
fonte
Primeira etapa: obter o ID do contêiner:
docker ps
Isso mostrará algo como
1170fe9e9460
é o ID do contêiner neste caso.Segundo , entre na janela de encaixe:
docker exec -it [container_id] bash
então no caso acima:
docker exec -it 1170fe9e9460 bash
fonte
Que tal executar o tmux / GNU Screen dentro do contêiner? Parece a maneira mais fácil de acessar quantos vty você deseja com um simples:
fonte
docker attach
e eu apontou que:...the attach command attaches to the running tty, not a new one, hence the question title is "...with new TTY"
nsenter
faz isso. No entanto, eu também precisava inserir um contêiner de uma maneira simples e o nsenter não era suficiente para minhas necessidades. Era um bug em algumas ocasiões (a tela preta mais a bandeira -wd não estava funcionando). Além disso, eu queria entrar como um usuário específico e em um diretório específico.Acabei fazendo minha própria ferramenta para entrar em contêineres. Você pode encontrá-lo em: https://github.com/Pithikos/docker-enter
Seu uso é tão fácil quanto
fonte
A maneira "nsinit" é:
instalar nsinit
de dentro do contêiner:
de fora:
use-o
fonte
Levará você ao console de contêineres.
fonte
fonte
Comecei o powershell em um microsoft / iis executando como daemon usando
fonte
No Windows 10 , tenho a janela de encaixe instalada. Estou executando o Jnekins em um contêiner e encontrei a mesma mensagem de erro. Aqui está um guia passo a passo para resolver esse problema:
Passo 1: Abra o gitbash e execute a janela de encaixe run -p 8080: 8080 -p 50000: 50000 jenkins.
Passo 2: Abra um novo terminal.
Etapa 3: execute "docker ps" para obter a lista do contêiner em execução. Copie a identificação do contêiner.
Passo 4: Agora, se você executar "docker exec -it {container id} sh" ou "docker exec -it {container id} bash", receberá uma mensagem de erro semelhante a "o dispositivo de entrada não é um TTY. Se você estiver usando mintty, tente prefixar o comando com 'winpty' "
Etapa 5: execute o comando " $ winpty docker exec -it {container id} sh "
vola !! Agora você está dentro do terminal.
fonte