Назад | Перейти на главную страницу

CoreOS: как установить зависимости для контейнеров Docker в облачной конфигурации?

У меня есть базовый cloud-config.yaml для запуска четырех контейнеров на CoreOS (напрямую, без кластеризации). Два контейнера (nginx-gen и nginx-letsencrypt) смонтировать тома из контейнера с именем nginx. Каждый запуск контейнера определяется как модуль systemd.

я добавил After= и Requires= зависимости, однако при первом входе в систему меня встречают:

CoreOS stable (1185.5.0)
Failed Units: 2
  letsencrypt.service
  nginx-gen.service

nginx (тот, который обеспечивает объем) работает.

Если после этого я выполню:

sudo systemctl start nginx-gen.service
sudo systemctl start letsencrypt.service

Они запускаются и работают правильно, поэтому я предполагаю, что проблема в зависимостях при запуске системы.

У меня нет опыта работы с CoreOS или systemd, поэтому причина может быть довольно простой (например, модуль получает «полный» -статус перед запуском контейнера Docker).

И глядя на journalctl журнал, действительно nginx-gen служба не работает до того, как у нее появится возможность смонтировать тома из nginx:

...
Jan 02 14:35:47 core-01 systemd[1]: nginx-gen.service: Failed with result 'start-limit-hit'.
...
Jan 02 14:36:03 core-01 docker[1401]: Status: Downloaded newer image for nginx:latest
...

Что я могу сделать, чтобы решить проблему?


Мой cloud-config.yaml:

#cloud-config

write_files:  
  # omitted for ServerFault: ensure template file
  #   https://raw.githubusercontent.com/jwilder/nginx-proxy/master/nginx.tmpl)
  #   and directories (/path/to/templates, /path/to/certs) are in-place

coreos:
  units:
    - name: nginx.service
      command: start
      content: |
        [Unit]
        Description=Generic Nginx container

        [Service]
        Restart=always
        ExecStart=/usr/bin/docker run --name nginx -p 80:80 -p 443:443 -v /etc/nginx/conf.d -v /etc/nginx/vhost.d -v /usr/share/nginx/html -v /path/to/certs:/etc/nginx/certs:ro nginx
        ExecStop=/usr/bin/docker rm -f nginx

    - name: nginx-gen.service
      command: start
      content: |
        [Unit]
        Description=Docker-gen service for Nginx

        After=nginx.service
        Requires=nginx.service

        [Service]
        Restart=always
        ExecStart=/usr/bin/docker run --name nginx-gen --volumes-from nginx -v /path/to/templates:/etc/docker-gen/templates -v /path/to/certs:/etc/nginx/certs:ro -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/docker-gen -notify-sighup nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
        ExecStop=/usr/bin/docker rm -f nginx-gen

    - name: letsencrypt.service
      command: start
      content: |
        [Unit]
        Description=Ngnix reverse proxy Letsencrypt companion

        After=nginx.service
        Requires=nginx.service

        [Service]
        Restart=always
        ExecStart=/usr/bin/docker run --name nginx-letsencrypt -e "NGINX_DOCKER_GEN_CONTAINER=nginx-gen" --volumes-from nginx -v /path/to/certs:/etc/nginx/certs:rw -v /var/run/docker.sock:/var/run/docker.sock:ro jrcs/letsencrypt-nginx-proxy-companion
        ExecStop=/usr/bin/docker rm -f nginx-letsencrypt

За http://container-solutions.com/running-docker-containers-with-systemd/, вам необходимо обеспечить запуск этих контейнеров после службы докеров.

Образец:

[Unit]
Description=Redis Container
After=docker.service
Requires=docker.service

[Service]
TimeoutStartSec=0
Restart=always
ExecStartPre=-/usr/bin/docker stop %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStartPre=/usr/bin/docker pull redis
ExecStart=/usr/bin/docker run --rm --name %n redis

[Install]
WantedBy=multi-user.target

Итак, в вашем случае добавление Requires = docker.service в раздел Unit вашего модуля nginx должно сделать это и, вероятно, добавить WantedBy к каждому из ваших модулей, чтобы SystemD знал, как их запускать.