Eu tenho um Dockerfile para instalar o servidor MySQL em um contêiner, que então começo assim:
sudo docker run -t -i 09d18b9a12be /bin/bash
Mas o serviço MySQL não inicia automaticamente, eu tenho que executar manualmente (de dentro do contêiner):
service mysql start
Como inicio automaticamente o serviço MySQL quando executo o contêiner do docker?
Respostas:
Primeiro, há um problema no seu
Dockerfile
:As imagens do Docker não salvam os processos em execução. Portanto, seu
RUN
comando é executado apenas durante adocker build
fase e para após a conclusão da compilação. Em vez disso, você precisa especificar o comando quando o contêiner for iniciado usando os comandosCMD
ouENTRYPOINT
como abaixo:Em segundo lugar, o contêiner do docker precisa de um processo (último comando) para continuar em execução, caso contrário, o contêiner sairá / parará. Portanto, o
service mysql start
comando normal não pode ser usado diretamente no Dockerfile.Solução
Existem três maneiras típicas de manter o processo em execução:
Usando o
service
comando e acrescentar comando não-final depois disso, comotail -F
Isso geralmente é preferido quando você tem um único serviço em execução, pois torna o log de saída acessível à janela de encaixe.
Ou use o comando de primeiro plano para fazer isso
Isso funciona apenas se houver um script como
mysqld_safe
.Ou envolva seus scripts
start.sh
e encerre issoÉ melhor se o comando precisar executar uma série de etapas, novamente,
/start.sh
permanecer em execução.Nota
Para iniciantes, o uso
supervisord
não é recomendado. Honestamente, é um exagero. É muito melhor usar serviço único / comando único para o contêiner.BTW: verifique https://registry.hub.docker.com para obter imagens existentes do mysql docker para referência
fonte
docker exec -it <CONTAINER NAME> mysql /etc/init.d/mysqld restart
No seu
Dockerfile
, adicione na última linhaFunciona para mim
E este é o resultado:
fonte
docker stop
oudocker restart
normalmente, apenas pode ser eliminado .Simples! Adicione no final do dockerfile:
fonte
Docker version 18.09.7, build 2d0083d
sem&& /bin/bash
o serviço irá parar imediatamenteHá outra maneira de fazer isso que eu sempre achei mais legível.
Digamos que você queira iniciar o rabbitmq e o mongodb ao executá-lo, então
CMD
será algo assim:Como você pode ter apenas um
CMD
porDockerfile
truque, concatenar todas as instruções&&
e usar\
para cada comando iniciar uma nova linha.Se você acabar adicionando muitos desses, sugiro que você coloque todos os seus comandos em um arquivo de script e inicie-o como @ larry-cai sugerido:
fonte
No meu caso, eu tenho um aplicativo Web PHP sendo servido pelo Apache2 dentro do contêiner do docker que se conecta a um banco de dados back-end MYSQL. A solução de Larry Cai trabalhou com pequenas modificações. Criei um
entrypoint.sh
arquivo no qual estou gerenciando meus serviços. Eu acho que criar umentrypoint.sh
quando você tiver mais de um comando para executar quando o contêiner for inicializado é uma maneira mais limpa de inicializar o docker.fonte
ENTRYPOINT ['your location']
instrução para o arquivo de script. Lembre-se de definir as permissões de execução no seu script.COPY entrypoint.sh /entrypoint.sh RUN chmod 755 /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]
. Neste exemplo, copiei meu ponto de entrada no diretório raiz no contêiner do docker.Tenho o mesmo problema quando quero iniciar automaticamente o serviço ssh. Eu achei esse anexo
para pode resolvê-lo, mas somente você o abre com o bash.fonte
Adicionei o seguinte código ao /root/.bashrc para executar o código apenas uma vez,
Confirme o contêiner na imagem antes de executar este script, caso contrário, o arquivo 'docker_services' será criado nas imagens e nenhum serviço será executado.
fonte
Aqui está como inicio automaticamente o serviço MySQL sempre que o contêiner do docker é executado.
No meu caso, eu preciso executar não apenas o MySQL, mas também PHP, Nginx e Memcached
Eu tenho as seguintes linhas no Dockerfile
Adicionar && bash manteria o Nginx, MySQL, PHP e Memcached em execução no contêiner.
fonte
Isso não funciona
CMD service mysql start && /bin/bash
Isso não funciona
CMD service mysql start ; /bin/bash ;
- Eu acho que o modo interativo não suporta primeiro plano.
Isso funciona !!
CMD service nginx start ; while true ; do sleep 100; done;
Isso funciona !!
CMD service nginx start && tail -F /var/log/nginx/access.log
cuidado que você deve usar
docker run -p 80:80 nginx_bash
sem o parâmetro de comando.fonte
A documentação a seguir do site do Docker mostra como implementar um serviço SSH em um contêiner do docker. Deve ser facilmente adaptável ao seu serviço:
Uma variação sobre essa pergunta também foi feita aqui:
fonte
Pode ser necessário remover o contêiner existente usando a ...
Importe com as modificações necessárias:
Execute o contêiner, por exemplo, com a opção sempre reiniciar para garantir que ele seja retomado automaticamente após a reciclagem do host / daemon:
Nota lateral: Na minha opinião, razoável é iniciar apenas o serviço cron deixando o contêiner o mais limpo possível, em seguida, basta modificar o crontab ou cron.hourly, .daily etc ... com os scripts de verificação / monitoramento correspondentes. A razão é que você depende apenas de um daemon e, em caso de alterações, é mais fácil com o ansible ou o fantoche redistribuir scripts cron em vez de rastrear serviços que iniciam na inicialização.
fonte