天天看點

Docker容器運作多條指令(supervisor)一, 簡介二,存在的問題——日志不輸出三,解決方案參考

一, 簡介

Dockerfile 運作隻支援一條指令,當在Docker裡要運作多條指令,用supervisor來管理就比較合适了。

Supervisor是一個 Python 開發的 client/server 系統,可以管理和監控類 UNIX 作業系統上面的程序。它可以同時啟動,關閉多個程序,使用起來特别的友善。

組成部分

supervisor 主要由兩部分組成:

  1. supervisord(server 部分):主要負責管理子程序,響應用戶端指令以及日志的輸出等;
  2. 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/