Como executar o docker-compose na inicialização?

20

Isso ocorre em uma VM Ubuntu 14.04 LTS executando o Docker e suspeito que respawnseja a causa do meu problema, mas não tenho certeza da solução ideal.

Script inicial recente ( cat /etc/init/dockersuitecrm.conf)

description "Start docker containers"
author "Batman"
start on filesystem and started docker
stop on runlevel [!2345]
respawn
script
    docker-compose -f /usr/bin/myapp/docker-compose.yml -p myapp start
end script

Isso 'funciona', pois myappé ativo e responsivo, mas /sbin/initocupa toda a CPU quando eu monitoro htop. Se eu remover a entrada do upstart ( sudo rm /etc/init/dockersuitecrm.conf) e executar manualmente o SSH e executar docker-compose -f /usr/bin/myapp/docker-compose.yml -p myapp start, não vejo a cpu com 100% de problemas e, como antes, ela myappestá novamente ativa e responsiva.

Portanto, desconfio que a maneira como estou começando a composição do docker acima está incorreta. Qual é o caminho certo para começar docker-composesempre funcionando sem intervenção manual?

EDIT: Não deve importar, mas /usr/bin/myapp -> /home/batman/dockerapps/myappcomo um link simbólico.

DeepSpace101
fonte
Não é uma solução, mas como solução alternativa, sou capaz de executar isso sem o respawncomando no script.
precisa saber é o seguinte
Mesma pergunta, mas eu vi o seguinte: serverfault.com/questions/615820/… . A mágica é com o uso docker-compose start.
Mark Lopez
Eu tenho uma configuração semelhante, mas não use um scriptbloco. Talvez isso faça parte do problema? Eu tenho chdir /usr/bin/myapp/e na próxima linha em seu exec docker-compose uplugar.
21135 jmreicha
Você não quer apenas executar o docker-compose em segundo plano? iedocker-compose up -d
KCD 01/12
colocar restart: sempre na especificação recipiente
Lu32

Respostas:

9

Basta usar o crontab, em vez de usar um intervalo de tempo, basta dizer @reboot

Portanto, faça o login como o usuário que deve iniciar esse script e digite o comando

crontab -e

e depois insira

@reboot /better/enter/fullpath/here/docker-compose -f /usr/bin/myapp/docker-compose.yml -p myapp start

Reinicie o sistema e veja se funciona. Há uma vantagem sobre o iniciante, mesmo que seja iniciado um pouco mais tarde, você não precisa se preocupar muito com dependências como rede, etc., para já estar pronto.

s1mmel
fonte
Alguma idéia de como uma reinicialização limpa seria executada dessa maneira?
Justin Smith
11
Desculpe, mas esta não é uma resposta muito boa. Pode funcionar de tempos em tempos, mas como o cron pode ser carregado antes de outros requisitos do docker, você encontra uma condição de corrida.
Otheus 7/08/17
2

Supondo que você esteja usando a versão 2 das definições do Docker Compose docker-compose.yml, você pode fazer o seguinte:

Definindo restart: alwaysassim:

version: '2'
services:
  web:
    image: nginx
    restart: always

Referência: https://docs.docker.com/compose/compose-file/compose-file-v2/

Sergei Filippov
fonte
11
A pergunta é: qual site do docker não responde, era: "Qual é a maneira correta de iniciar o docker-compose sempre em execução sem intervenção manual?"
Otheus 7/08/17
0

O Docker não está pronto imediatamente Se você executar o script muito cedo, nada acontecerá. O docker começará a responder ao comando docker ps assim que estiver pronto, para que você possa usar este truque no crontab:

nano / etc / crontabs / root

@reboot / usr / bin / docker ps && / usr / bin / docker-compose -f /prod.yml start

Evgeny Savelov
fonte