Перезапуск докера, который запускает программы supervisord, сохраняет pid файлы и вызывает ошибку при перезапуске

У меня есть докер, который запускает Django Celery Worker через супервизор, программа установки довольно проста

[program:celery_priority]
command=python manage.py celery worker -E -Q priority --concurrency=2 --loglevel=ERROR
directory=/var/lib/app
stdout_events_enabled = true
stderr_events_enabled = true
stopwaitsecs = 600

[program:celery_medium]
command=python manage.py celery worker -E -Q medium --concurrency=2 --loglevel=ERROR
directory=/var/lib/app
stdout_events_enabled = true
stderr_events_enabled = true
stopwaitsecs = 600

[program:celerycam]
command=python manage.py celerycam
directory=/var/lib/app
stdout_events_enabled = true
stderr_events_enabled = true
stopwaitsecs = 600

Наш цикл развертывания использует fig для управления докерами, вот как выглядит наш файл fig.yml для рабочего

worker:
  build: .docker/worker
  command: normal
  volumes_from:
    - appdata
  hostname: workerprod
  domainname: project.internal
  links:
    - redis
    - rabbit
    - appdata
    - mail

Проблема, с которой мы сталкиваемся, заключается в том, что, когда мы пытаемся использовать fig restart worker программа super visord завершается сбоем, потому что она находит конфликт в pid со следующей ошибкой

[130.211.XX.XX] out: worker_1     | celery_medium stderr | [2015-02-13 13:40:54,271: WARNING/MainProcess] ERROR: Pidfile (/tmp/med_celery.pid) already exists.
[130.211.XX.XX] out: worker_1     | Seems we're already running? (pid: 17)
[130.211.XX.XX] out: worker_1     | celery_priority stderr | [2015-02-13 13:40:54,272: WARNING/MainProcess] ERROR: Pidfile (/tmp/priority_celery.pid) already exists.
[130.211.XX.XX] out: worker_1     | Seems we're already running? (pid: 16)
[130.211.XX.XX] out: worker_1     | 2015-02-13 18:40:54,359 INFO exited: celery_medium (exit status 0; expected)
[130.211.XX.XX] out: worker_1     | 2015-02-13 18:40:54,359 INFO exited: celery_priority (exit status 0; expected)
[130.211.XX.XX] out: worker_1     | 2015-02-13 18:40:55,360 INFO success: celerycam entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

Тем не менее, когда мы используем fig -d up worker это работает, потому что, по-видимому, с up fig попытался воссоздать контейнер и не использовать существующий. Но это приводит к тому, что все связанные сервисы тоже воссоздаются и, следовательно, теряют данные RabbitMQ и кэш Redis.

Есть ли способ перезапустить докер с помощью простого fig restart worker и убедитесь, что pid очищается при перезапуске? пожалуйста, порекомендуйте

1 ответ

Решение

Создать ENTRYPOINT скрипт, который очищает любые данные о состоянии перед запуском CMD, Например

FROM someotherimage
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

И в entrypoint.sh:

#!/bin/sh
rm -f /tmp/*.pid
exec "$@"

ENTRYPOINT скрипт будет запускаться каждый раз при запуске контейнера и будет гарантировать, что любые pid-файлы в /tmp очищаются перед выполнением команды контейнера.

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