Quero iniciar um serviço com docker-compose e manter o contêiner em execução para que possa obter seu endereço IP por meio de 'docker inspect'. No entanto, o contêiner sempre sai logo após a inicialização.
Tentei adicionar "command: [" sleep "," 60 "]" e outras coisas ao docker-compose.yml, mas sempre que adiciono a linha com "command: ..." não consigo chamar "docker-compose up" pois receberei a mensagem "Não é possível iniciar o contêiner ..... Erro de sistema: caractere inválido 'k' procurando o início do valor"
Eu também tentei adicionar "CMD sleep 60" e outros enfeites ao próprio Dockerfile, mas esses comandos não parecem ser executados.
Existe uma maneira fácil de manter o contêiner vivo ou de consertar um dos meus problemas?
EDIT: Aqui está o arquivo Compose que desejo executar:
version: '2'
services:
my-test:
image: ubuntu
command: bash -c "while true; do echo hello; sleep 2; done"
Está funcionando bem Se eu começar com docker-compose no OS X, mas se eu tentar o mesmo no Ubuntu 16.04, aparece a mensagem de erro acima.
Se eu tentar a abordagem com o Dockerfile, o Dockerfile ficará assim:
FROM ubuntu:latest
CMD ["sleep", "60"]
Que parece não fazer nada
EDIT 2: Tenho que me corrigir, descobri que era o mesmo problema com o Dockerfile e o docker-compose.yml: Cada vez que adiciono "CMD ..." ao Dockerfile OU adiciono "command ..." o arquivo de composição, recebo o erro acima com o caractere inválido. Se eu remover os dois comandos, ele funcionará perfeitamente.
fonte
Respostas:
Para manter um contêiner em execução ao iniciá-lo
docker-compose
, use o seguinte comandocommand: tail -F anything
Então, seu docker-compose.yml se torna
e você pode executar um shell para entrar no contêiner usando o seguinte comando
docker exec -i -t composename_my-test_1 bash
onde
composename
é o nome quedocker-compose
precede seus contêineres.fonte
exit
para voltar à máquina host. Se você estiver em seu host, poderá interromper o contêiner usando Docker (docker stop composename_my-test_1
) ou Docker Compose (docker-compose stop
)./dev/null
seria melhor no lugar para oanything
comando ref. stackoverflow.com/a/48732671/248616Você pode usar a
tty
opção de configuração.Nota: Se você usar Dockerfile para imagem e
CMD
no Dockerfile, esta opção não funcionará; no entanto, você pode usar aentrypoint
opção no arquivo de composição que limpa oCMD
do Dockerfile.fonte
tail -f /dev/null
. Com isso, posso executar um ambiente de desenvolvimento em contêiner com um banco de dados postgres anexadodocker-compose up
e executar um shell por meio de outro terminal usandodocker exec
.tail -f /dev/null
outail -f anything
, veja aqui: docs.docker.com/compose/compose-fileCom base no comentário de @aanand no GitHub em 26 de agosto de 2015 , pode-se usar
tail -f /dev/null
no docker-compose para manter o contêiner em execução.exemplo docker-compose.yml
Por que este comando?
A única razão para escolher essa opção foi que ela recebeu muitos polegares para cima no GitHub, mas a resposta com maior votação não significa que seja a melhor resposta. O segundo motivo foi pragmático, pois os problemas tiveram que ser resolvidos o mais rápido possível devido aos prazos.
fonte
docker-compose.yml
docker-compose up -d
partir do terminaldocker ps
para obter o nome ou id do contêinerdocker inspect $container_id
docker-compose exec ubuntu /bin/bash
oudocker-compose exec ubuntu /bin/sh
docker-compose down
Aqui está um pequeno script bash (
my-docker-shell.sh
) para criar o arquivo docker compose, executar o contêiner, fazer login no contêiner e, finalmente, limpar o contêiner docker e o arquivo docker compose quando você fizer logout.#!/bin/bash cat << 'EOF' > ./docker-compose.yml --- version: "3" services: ubuntu: image: ubuntu:latest command: /bin/bash # tty: true ... EOF printf "Now entering the container...\n" docker-compose run ubuntu bash docker-compose down rm -v ./docker-compose.yml
fonte
No Dockerfile, você pode usar o comando:
fonte
Como o comentador afirmou, teríamos que ver o Dockerfile em questão para lhe dar uma resposta completa, mas esse é um erro muito comum. Posso garantir que o comando que você está tentando executar está iniciando um processo em segundo plano. Este pode ser o comando que você executaria em situações não Docker, mas é a coisa errada a se fazer em um Dockerfile. Por exemplo, se o que você está executando normalmente é definido como um serviço do sistema, você pode usar algo como "systemctl start". Isso iniciaria o processo em segundo plano, o que não funcionaria. Você tem que executar o processo em primeiro plano, então todo o processo será bloqueado.
fonte
Apenas uma nota rápida
Eu testei uma imagem única com base em
golang
, então quando eu chamodocker-compose down
aqui o que eu obtenho:Informações do meu sistema:
fonte
Ok, encontrei meu erro. No Dockerfile da imagem usada para compor, especifiquei que a imagem base deveria ser ubuntu: latest, mas anteriormente criei uma imagem chamada ubuntu por mim e essa imagem não funcionou. Então, eu não usei a imagem original do ubuntu, mas sim uma versão corrompida da minha própria imagem também chamada de ubuntu.
fonte