重新启动运行supervisord程序的docker可以保留pid文件,并在重新启动时导致错误

我有一个docker,通过supervisord运行django芹菜工,程序设置非常简单

[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来pipe理docker,下面是我们的fig.yml文件对于worker的样子

 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它的工作,因为显然与无花果尝试重新创build容器,而不是使用现有的。 但这会导致所有链接的服务重新创build,从而丢失RabbitMQ数据和Rediscaching。

有没有办法重新启动泊坞窗使用简单的fig restart worker ,并确保重新启动时清除PID? 请指教

创build一个ENTRYPOINT脚本,在运行CMD之前清理所有状态数据。 例如

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

entrypoint.sh

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

ENTRYPOINT脚本将在每次容器启动时运行,并确保在运行容器命令之前清除/tmp中的任何pid文件。