Запуск docker-compose с помощью systemd unit
Jul 23, 2018 07:02 · 320 words · 2 minute read
Возникла необходимость запускать сервисы, описанные в файле docker-compose.yml
, при загрузке сервера. Давайте разберемся!
Сразу отмечу, что если каждому сервису в docker-compose.yml
добавить параметр:
restart: always
после чего запустить сервисы командой docker-compose up -d
, то они будут самостоятельно стартовать после перезагрузки компьютера.
В моем же случае, ситуация несколько другая - необходимо, чтобы docker-compose запускал сервисы еще в процессе “развертывания” самого сервера (например, с помощью системы управления конфигурациями chef
или ansible
). Здесь на помощь и приходит вариант с использованием systemd unit.
Примечание. В данной статье я не рассматриваю использование систем управления конфигурациями.
Создадим файл /etc/systemd/system/jfrog.service
следующего содержания:
[Unit]
Description=JFrog service with docker-compose
Requires=docker.service
After=docker.service
[Service]
Restart=always
WorkingDirectory=/opt/jfrog/
# Remove old containers, network and volumes
ExecStartPre=/usr/local/bin/docker-compose -f docker/docker-compose.yaml down -v
ExecStartPre=-/bin/bash -c 'docker network rm docker_jfrog_net'
ExecStartPre=-/bin/bash -c 'docker ps -aqf "name=artifactory" | xargs docker rm'
# Compose up
ExecStart=/usr/local/bin/docker-compose -f docker/docker-compose.yaml up
# Compose down, remove containers
ExecStop=/usr/local/bin/docker-compose -f docker/docker-compose.yaml down
[Install]
WantedBy=multi-user.target
Как видим из параметра WorkingDirectory
, все необходимые для работы файлы должны находиться в каталоге /opt/jfrog/
(разместить их там используя chef
или ansible
не составит труда). Перед стартом сервиса (как написано в ExecStartPre
) убедимся, что никакие тома/сети/контейнеры нам не помешают (и, если остались какие-то “хвосты” - удалим их).
Для старта (строка с ExecStart
) будет использоваться команда docker-compose -f docker/docker-compose.yaml up
, а для остановки сервиса (строка с ExecStop
) - команда docker-compose -f docker/docker-compose.yaml down
.
Сам конфигурационный файл docker-compose.yaml
расположен в каталоге /opt/jfrog/docker/
и выглядит следующим образом:
version: '3'
networks:
jfrog_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.20.0.0/16
services:
artifactory:
image: docker.bintray.io/jfrog/artifactory-oss:6.1.0
container_name: artifactory
restart: always
volumes:
- ../artifactory:/var/opt/jfrog/artifactory
- ../artifactory.config.import.xml:/var/opt/jfrog/artifactory/etc/artifactory.config.import.xml
networks:
jfrog_net:
ipv4_address: "172.20.0.5"
Здесь все должно быть понятно, внимание стоит обратить только на файл artifactory.config.import.xml
(находящийся в директории /opt/jfrog/
) - в нем находятся настройки JFrog artifactory (в основном, список репозиториев и доступы к ним). Эти настройки будут применяться при старте сервиса JFrog в docker-контейнере.
После проделанных действий не забываем выполнить:
systemctl daemon-reload
service jfrog enable
service jfrog start