systemd и запуск докер-контейнеров

Итак, я новичок в docker и хотел запустить контейнер докера logspout при запуске сервера, поэтому я подумал, что просто добавлю файл запуска systemd:

[Unit]
Description=Logspout GELF Container
After=docker.service
Requires=docker.service

[Service]
TimeoutStartSec=0
Restart=always
ExecStartPre=-/usr/bin/docker stop logspout-gelf
ExecStartPre=-/usr/bin/docker rm logspout-gelf
ExecStart=/usr/bin/docker run --name=logspout-gelf \
  -h $(hostname -f) \
  -v /var/run/docker.sock:/var/run/docker.sock \
  123456789.dkr.ecr.${region}.amazonaws.com/logspout-gelf:latest \
  gelf://${DOCKER_HOST}:12202

[Install]
WantedBy=multi-user.target

В служебном файле также есть файл конфигурации, который изменяется при загрузке скриптом пользовательских данных:

# Ansible
[Service]
Environment=DOCKER_HOST=10.100.10.1

Я получаю ошибку при перезапуске после того, как ip DOCKER_HOST заполняется пользовательскими данными:

systemd[1]: Starting Logspout GELF Container...
Cannot connect to the Docker daemon at tcp://10.100.10.1:2375. Is the docker daemon running?
Cannot connect to the Docker daemon at tcp://10.100.10.1:2375. Is the docker daemon running?

Это переворачивает полдюжины раз, затем терпит неудачу Если я затем установлю DOCKER_HOST, запустите контейнер докера, скопируйте команду и запустите ее в тот момент, когда она запускается без проблем.

Есть идеи, почему это не удается?

ОБНОВИТЬ

Почему при запуске контейнера с systemd logspout по умолчанию принимает значение tcp? Установка gelf+udp://${DOCKER_HOST}:12202 выдает ту же ошибку выше, что упоминает tcp. UDP игнорируется при использовании systemd?

2 ответа

Это кажется странностью в logspout, где он пытается начать использовать TCP, даже если установлен gelf+udp. Запуск вне systemd с запуском docker и docker-compose работают как положено.

У меня нет времени, чтобы выяснить, почему в это время, поэтому я просто позволю docker запустить --restart= Если-остановлено, чтобы управлять контейнером и чтобы скрипт пользовательских данных на сервере EC2 запускал контейнер при загрузке.

Похоже, что служба Docker еще не запущена, запуск контейнера из CLI запустит службу и запустит ваш контейнер.

Прежде чем запускать контейнер вручную, проверьте состояние docker.service с помощью systemctl status docker.service, Если он не работает, вам нужно добавить службу systemd для docker.service также.

Другие вопросы по тегам