一, 簡介
Dockerfile 運作隻支援一條指令,當在Docker裡要運作多條指令,用supervisor來管理就比較合适了。
Supervisor是一個 Python 開發的 client/server 系統,可以管理和監控類 UNIX 作業系統上面的程序。它可以同時啟動,關閉多個程序,使用起來特别的友善。
組成部分
supervisor 主要由兩部分組成:
- supervisord(server 部分):主要負責管理子程序,響應用戶端指令以及日志的輸出等;
- supervisorctl(client 部分):指令行用戶端,使用者可以通過它與不同的 supervisord 程序聯系,擷取子程序的狀态等。
二,存在的問題——日志不輸出
但是使用supervisor,Django運作的日志就不會在Docker裡輸出了,預設的輸出如下:
2018-03-28 06:48:20,292 CRIT Supervisor running as root (no user in config file)
2018-03-28 06:48:20,308 INFO supervisord started with pid 1
2018-03-28 06:48:21,310 INFO spawned: 'celery_beat' with pid 7
2018-03-28 06:48:21,312 INFO spawned: 'celery_worker' with pid 8
2018-03-28 06:48:21,313 INFO spawned: 'django' with pid 9
2018-03-28 06:48:22,315 INFO success: celery_beat entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2018-03-28 06:48:22,315 INFO success: celery_worker entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2018-03-28 06:48:22,315 INFO success: django entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
上面的Docker中supervisor配置如下:
[supervisord]
nodaemon=true
[program:django]
command=python manage.py runserver 0.0.0.0:8080
[program:celery_worker]
command=python manage.py celery worker -c 4 -l info
[program:celery_beat]
command=python manage.py celery beat
這樣的配置在容器中是同時運作Django,celery。
三,解決方案
1,改進後的配置方案
[inet_http_server]
port=9001
username=abc
password=123456
[supervisord]
nodaemon=true
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP)
[program:django]
command=python manage.py runserver 0.0.0.0:8080
#stdout_logfile = /var/log/supervisord/django_stdout.log
loglevel=info
redirect_stderr=true
[program:celery_worker]
command=python manage.py celery worker -c 4 -l info
loglevel=info
redirect_stderr=true
[program:celery_beat]
command=python manage.py celery beat
loglevel=info
redirect_stderr=true
實測發現Django的日志輸出會寫到stderr.log檔案中,是以在配置檔案中将錯誤日志重定向到标準日志裡;
redirect_stderr=true
容器中的生成的日志檔案如下:
root@a16bc77e96bc:/var/log/supervisor# ls
celery_beat-stderr---supervisor-rSPQ7E.log django-stderr---supervisor-9LS_KA.log
celery_beat-stdout---supervisor-t5Q4UI.log django-stdout---supervisor-cTSBmq.log
celery_worker-stderr---supervisor-TRFzc7.log supervisord.log
celery_worker-stdout---supervisor-xNgeBU.log
2,檢視日志
運作容器時,将9001端口映射出去,通過ip:9001通路:
[圖檔上傳失敗...(image-20da97-1522375135673)]
點選 Tail -f 檢視各個程序的日志。
參考
http://debugo.com/docker-supervisord/
http://blog.csdn.net/zhousenshan/article/details/52988885
supervisor配置
作者部落格:
http://kekefund.com/2018/03/30/supervisor/