Iniciando o docker-compose com systemd no ubuntu 15.04

10

Eu tenho um projeto de docker-compose que gostaria de controlar através do systemd. No início, eu usaria um script que se parece com isso:

description "Start/Stop server"
author "Jim Cortez"

start on filesystem and started docker
stop on runlevel [!2345]

respawn limit 3 240

pre-start script
    # wait (if necessary) for our docker context to be accessible
    while [ ! -f /projects/my_server/docker-compose.yml ]
    do
      sleep 1
    done
    /usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml up -d
end script

script
    sleepWhileAppIsUp(){
        while docker ps | grep "$1" >/dev/null; do
            sleep 2
        done
    }

    sleepWhileAppIsUp "my_server"
end script

# stop docker container after the stop event has completed
post-stop script
    if docker ps | grep my_server;
    then
        /usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml stop
    fi
end script

(acima adaptado daqui )

No entanto, agora estou executando em um host docker que executa o Ubuntu 15.04, que mudou para systemd. Como posso fazer o acima como um script de serviço systemd? Simplesmente iniciar o daemon docker-compose não permitirá que o systemd rastreie e reinicie em caso de falha.

Aqui está o que eu tenho até agora:

[Unit]
Description=My Server container
Requires=docker.service
After=docker.service

[Service]
Restart=always
ExecStart=/usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml up -d
ExecStop=/usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml stop

[Install]
WantedBy=local.target
Jim Cortez
fonte

Respostas:

11

Sugiro remover a -dopção. Você não precisa executar os contêineres em segundo plano nesse caso.

Kevin Rood
fonte
6

Descobri que: O autor usa uma abordagem semelhante como você http://trackless.ca/2015/12/21/docker-compose-meets-systemd/ . Além disso, ele cria um serviço systemd para cada serviço de docker-compondo.

Você pode considerar converter seu arquivo docker-compose em vários arquivos de serviço do systemd para se livrar da dependência do docker-compose: http://container-transform.readthedocs.org/ Usei essa abordagem, funciona bem para configurações simples.

André B.
fonte
1
convém colocar algumas informações adicionais nos links em sua resposta. Os links tendem a não funcionar depois de algum tempo.
Dennis Nolte
1
de fato, o link não funciona mais ^^.
christophe31
Aqui está um link de Internet Archive para o primeiro post: web.archive.org/web/20161105135126/http://trackless.ca/2015/12/...
pdoherty926
0

Tente isso, encontrei no meu teste, que requer mais tempo do que o serviço normal para iniciar ou parar.

[Unit]
Description=My Server container
Requires=docker.service
After=network.target docker.service

[Service]
#Restart=always
Type=simple
WorkingDirectory=/projects/my_server
ExecStart=/usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml down

[Install]
WantedBy=multi-user.target
Daniel YC Lin
fonte
1
Eu acho que você deve usar o WorkingDirectory. docker-compor uso diretório de trabalho atual para carregar .env arquivos WorkingDirectory = / projetos / my_server também ExecStart = / usr / / bin local / janela de encaixe-compor para cima
Mohammadalijf