Запуск docker-compose с помощью systemd unit

Jul 23, 2018 07:02 · 320 words · 2 minute read docker-compose systemd

Возникла необходимость запускать сервисы, описанные в файле 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
tweet Share