Existe alguma maneira de iniciar um shell interativo em um contêiner usando apenas o Docker Compose? Eu tentei algo assim, no meu docker-compose.yml:
myapp:
image: alpine:latest
entrypoint: /bin/sh
Quando inicio este contêiner usando o docker-compose, ele sai imediatamente. Existem sinalizadores que eu possa adicionar ao comando do ponto de entrada ou como opção adicional ao myapp para iniciar como shell interativo?
Eu sei que existem opções de comando do docker nativo para conseguir isso, curioso para saber se é possível usar apenas o Docker Compose também.
/bin/sh
entrada no seu arquivo de composição, o que deve fazer?docker-compose run myapp
?docker-compose run myapp
que ele não expõe as portas. Então você tem que usar,docker-compose run --service-ports myapp
mas ainda não é muito conveniente.entrypoint: /bin/sh
deve serentrypoint: "/bin/sh"
Respostas:
Você precisa incluir as seguintes linhas no seu docker-compose.yml:
O primeiro corresponde a
-i
indocker run
e o segundo a-t
.fonte
stdin_open
é o link que falta, por simplesmente fornecer o comportamento esperado quando eu me conecto a um dos meus contêineres que já está executando um shell.docker-compose run <service_name>
docker exec
não funcionará.colorama\win32.py, line 152, in SetConsoleTitle: ctypes.ArgumentError: ‘ValueError’: embedded null character
A maneira canônica de obter um shell interativo com o docker-compose é usar:
docker-compose run --rm myapp
Você pode definir
stdin_open: true, tty: true
, no entanto, que na verdade não fornecerá um shell adequadoup
, porque os logs estão sendo transmitidos por todos os contêineres.Você também pode usar
para obter um shell em um contêiner em execução.
fonte
--service-ports
se você expor as portas (ou seja, para um servidor web)--rm
sinalizador para que o contêiner seja removido. A resposta de @ lynx0123 não está correta. Você não receberá um shell interativo se executardocker-compose up
.docker-compose run
funciona. Você também deseja adicionarcommand: /bin/bash
ao docker-compose.yml.No exemplo oficial de introdução ( https://docs.docker.com/compose/gettingstarted/ ) com o seguinte
docker-compose.yml
:Depois de iniciar isso
docker-compose up
, você pode facilmente desembolsar em seuredis
contêiner ou em seuweb
contêiner com:fonte
docker-compose run myapp sh
deve fazer o acordo.Há alguma confusão com
up
/run
, mas osdocker-compose run
documentos têm ótimas explicações: https://docs.docker.com/compose/reference/runfonte
Usando o docker-compose, achei a maneira mais fácil de fazer isso
docker ps -a
(depois de iniciar meus contêineresdocker-compose up
) e obter o ID do contêiner no qual quero ter um shell interativo (vamos chamá-lo de xyz123).Então é uma questão simples de executar
docker exec -ti xyz123 /bin/bash
e voila, uma concha interativa.
fonte
Se alguém do futuro também estiver aqui:
ou
ou você pode executar linhas únicas como
Isso é depois que você já tem seus contêineres em funcionamento
fonte
Você pode fazer
docker-compose exec SERVICE_NAME sh
na linha de comando. OSERVICE_NAME
é definido no seudocker-compose.yml
. Por exemplo,O
SERVICE_NAME
seria "tratador".fonte
Essa pergunta é muito interessante para mim porque tenho problemas, quando executo o contêiner após a execução terminar imediatamente sair e corrigi com -it:
E quando devo automatizá-lo com o docker compor:
Isso torna o truque: stdin_open: true, tty: true
Este é um projeto gerado com o create-react-app
Dockerfile.dev parece isso que:
Espero que este exemplo ajude outros a executar um front-end (reagir por exemplo) no contêiner do docker.
fonte
Se
yml
for chamadodocker-compose.yml
, pode ser iniciado com um simples$ docker-compose up
. A conexão correspondente de um terminal pode ser simples (considere que oyml
serviço especificado foi chamadomyservice
):No entanto, se você estiver usando um
yml
nome de arquivo diferente , comodocker-compose-mycompose.yml
, ele deve ser iniciado usando$ docker-compose -f docker-compose-mycompose.yml up
. Para conectar um terminal interativo, você deve especificar oyml
arquivo também, como:fonte