Criando um serviço no Ubuntu para rodar uma imagem Docker
Primeiro precisamos entender o que é o systemd
.
O Systemd é um sistema de inicialização usado por muitas distribuições Linux. Ele é responsável por iniciar e gerenciar os serviços do sistema. Para configurar um serviço no Systemd, é necessário criar um arquivo de unidade no diretório /etc/systemd/system/
. Neste artigo, vamos explicar cada um dos parâmetros que podem ser usados no arquivo de unidade.
Crie um arquivo no diretório /etc/systemd/system
[Unit]
Description=Onion Share
Wants=network-online.target
After=network-online.target
Wants=docker.service
After=docker.service
StartLimitInterval=0
[Service]
Type=forking
TimeoutStartSec=infinity
TimeoutStopSec=16min
ExecStart=/mnt/disk1/onion-farm/scripts/start
ExecStop=/mnt/disk1/umbrel/scripts/stop
User=root
Group=root
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=onion-service-startup
RemainAfterExit=yes
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Segue um resumo sobre os campos que podem ser usados nesse arquivo.
Seção [Unit]
A seção [Unit]
é usada para definir informações gerais sobre o serviço.
- Description: Uma descrição curta do serviço.
- Documentation: Uma URL ou caminho para a documentação do serviço.
- Requires: Uma lista de unidades que devem ser iniciadas antes deste serviço.
- After: Uma lista de unidades que devem ser iniciadas antes deste serviço.
Seção [Service]
A seção [Service]
é usada para definir informações específicas do serviço.
- ExecStart: O comando ou script que deve ser executado para iniciar o serviço.
- Type: O tipo do serviço, pode ser
simple
,forking
,oneshot
,dbus
,notify
,idle
. - User: O usuário que deve ser usado para executar o serviço.
- Group: O grupo que deve ser usado para executar o serviço.
- WorkingDirectory: O diretório de trabalho para o serviço.
- Environment: Uma lista de variáveis de ambiente a serem definidas para o serviço.
- StandardOutput: Onde enviar a saída padrão do serviço, pode ser
inherit
,null
,tty
,journal
,syslog
,kmsg
,journal+console
,syslog+console
,kmsg+console
. - StandardError: Onde enviar a saída de erro do serviço, pode ser
inherit
,null
,tty
,journal
,syslog
,kmsg
,journal+console
,syslog+console
,kmsg+console
. - Restart: Quando o serviço deve ser reiniciado, pode ser
no
,on-success
,on-failure
,on-abnormal
,on-abort
,on-watchdog
,always
. - RestartSec: O tempo a esperar antes de reiniciar o serviço.
- TimeoutStartSec: Quanto tempo esperar pelo início do serviço antes de considerá-lo falhado.
- TimeoutStopSec: Quanto tempo esperar pelo término do serviço antes de considerá-lo falhado.
- SyslogIdentifier: A identificação a ser usada ao registrar o serviço no syslog.
Seção [Install]
A seção [Install]
é usada para definir como o serviço deve ser instalado.
- WantedBy: A unidade ou alvo que deve ser iniciado quando este serviço é iniciado.
Agora precisamos criar os arquivos que vão iniciar e para o serviço docker.
Crie a pasta onde os arquivos serão adicionados. No meu caso eu criei no diretório mnt/disk1/onion-farm/scripts/start
#!/bin/bash
docker run \
-p 3000:5000 \
-v $(pwd)/html/:/var/www/html/ \
-v $(pwd)/http.d/:/etc/nginx/http.d/ \
-v $(pwd)/torrc.d/:/etc/torrc.d/ \
-v $(pwd)/tor/:/var/lib/tor/ \
-d \
--name onion-farm \
ricardobchaves6/onion-farm:v1.0.0
Vamos criar o arquivo que vai parar o container.
#!/bin/bash
docker stop -t 30 onion-farm
docker rm onion-farm
Vamos adicionar as permissões para os arquivos: sudo chmod 775 start stop
.
Execute o comando abaixo para que o seu serviço seja iniciado ao reiniciar o sistema operacional:
sudo systemctl enable onion-farm-startup.service
Teste seu serviço com:
systemctl start onion-farm-startup.service
systemctl stop onion-farm-startup.service
Sobre o start e stop, não vou explicar porque é simples de mais :)