2

私は、supervisord 経由で django celery worker を実行する docker を持っています。プログラムのセットアップは非常に簡単です。

[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 を使用して Docker を管理します。fig.yml ファイルがワーカーに対してどのように見えるかを次に示します。

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

私たちが直面している問題はfig restart worker、supervisord プログラムを使用しようとすると、次のエラーで 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と機能します。これは、どうやらupfig を使用してコンテナーを再作成しようとし、既存のコンテナーを使用しないためです。ただし、これによりすべてのリンクされたサービスも再作成され、RabbitMQ データと Redis キャッシュが失われます。

シンプルを使用してdockerを再起動し、再起動fig restart worker時にpidがクリアされるようにする方法はありますか? お知らせ下さい

4

1 に答える 1