之前的一篇帖子里曾经在Ubuntu云服务器上部署了Scrapyd容器,帖子如下:云服务器下docker部署scrapyd
目前需要对scrapyd添加了日志解析,该库的名称为logparser,它被用作在scrapyweb中解析scrapyd的日志。这里不介绍scrapyweb,感兴趣的可以去github上了解。
logparser库的工作原理是每隔一段时间(默认10s)查看一下日志文件夹,然后解析,并生成stats.json文件。scrapyd在开启了端口后可以访问scrapyd的目录,因此可以在不修改scrapyd的情况下对日志解析,举个例子,下面是我的scrapyd的工作目录:
目前我们只关注logs文件夹,如果此时的scrapyd服务器可以被访问的话,那么输入ip:port/logs则显示:
stats.json的内容如下:
{
"status": "ok",
"datas": {},
"settings_py": "/usr/local/lib/python3.7/site-packages/logparser/settings.py",
"settings": {
"scrapyd_server": "127.0.0.1:6800",
"scrapyd_logs_dir": "/opt/logs",
"parse_round_interval": 10,
"enable_telnet": true,
"override_telnet_console_host": "",
"log_encoding": "utf-8",
"log_extensions": [
".log",
".txt"
],
"log_head_lines": 100,
"log_tail_lines": 200,
"log_categories_limit": 10,
"jobs_to_keep": 100,
"chunk_size": 10000000,
"delete_existing_json_files_at_startup": false,
"keep_data_in_memory": false,
"verbose": false,
"main_pid": 0
},
"last_update_timestamp": 1582347412,
"last_update_time": "2020-02-22 04:56:52",
"logparser_version": "0.8.2"
}
由于当前的scrapyd服务器上并没有运行scrapy项目,所以datas那一栏的数据为空。
在大致了解了logparser的工作原理后,我们开始分析Dockerfille的编写,一般情况下,一个Docker容器只能运行一个进程,如果想要运行多个进程的话,就需要自己编写shell脚本或者使用supervisor等工具,本次采用第二种方案。
supervisor只能运行在类UNIX系统下,它主要负责管理进程,并且还提供了一个可视化的管理工具,如图所示:
接下来就开始Dockerfile的编写:
FROM python:3.7
ENV REFRESHED_AT 2020-02-22
ENV PATH /usr/local/bin:$PATH
#add the scrapyd configure file
ADD ./scrapyd.conf /etc/scrapyd/scrapyd.conf
#add requirements.txt
ADD requirements.txt /opt/requirements.txt
WORKDIR /opt
#install scrapyd
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
# install logparser
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple logparser
# 安装supervisor
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple supervisor
#拷贝supervisor
COPY supervisord.conf /etc/supervisor/
COPY supervisord_scrapyd.conf /etc/supervisor/
COPY supervisord_logparser.conf /etc/supervisor/
#设置容器启动时执行的命令
ENTRYPOINT ["supervisord", "-nc", "/etc/supervisor/supervisord.conf"]
EXPOSE 6800
EXPOSE 6801
前面几行依然是安装scrapyd,这里不再赘述。之后的两个pip命令,我们分别安装了logparser和supervisor;然后把supervisor需要的配置文件拷贝到/etc/supervisor/下,之后以前台运行supervisor;最后我们暴露了6800端口和6801端口,6801端口分配给了supervisor。
接下来是docker-compose.yml,该文件是Docker Compose所需要的配置文件,旨在文件化docker build run等命令:
version: "2.2"
services:
detail:
build: .
volumes:
- .:/opt
ports:
- "6800:6800"
- "6801:6801"
然后是supervisor的配置文件,该配置文件可以通过以下的命令生成:
echo_supervisord_conf > supervisord.conf
默认的配置文件基本够用,稍微删减部分注释的结果如下:
[unix_http_server]
file=/tmp/supervisor.sock ; the path to the socket file
[inet_http_server] ;HTTP服务器,提供web管理界面
port=0.0.0.0:6801 ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
username=qwerty1234 ;登录管理后台的用户名
password=qwerty1234 ;登录管理后台的密码
[supervisord]
logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10 ; # of main logfile backups; 0 means none, default 10
loglevel=info ; log level; default info; others: debug,warn,trace
pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=false ; start in foreground if true; default false
minfds=1024 ; min. avail startup file descriptors; default 1024
minprocs=200 ; min. avail process descriptors;default 200
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
;[program:theprogramname]
;command=/bin/cat ; the program (relative uses PATH, can take args)
;autostart=true ; start at supervisord start (default: true)
;startsecs=1 ; # of secs prog must stay up to be running (def. 1)
;startretries=3 ; max # of serial start failures when starting (default 3)
;autorestart=unexpected ; when to restart if exited after running (def: unexpected)
[include]
files = supervisord_scrapyd.conf supervisord_logparser.conf
改动的地方如下:
supervisor_scrapyd.conf文件如下:
[program:scrapyd]
command=/usr/local/bin/python /usr/local/bin/scrapyd
autostart=true
startreties=3
autorestart=unexpected
supervisor_logparser.conf
[program:logparser]
command=/usr/local/bin/python /usr/local/bin/logparser -dir /opt/logs
autostart=true
startreties=3
autorestart=unexpected
配置文件终于列完了,接下来就是创建docker镜像了:
docker-compose up -d
该命令会首先创建镜像(如果不存在的话),然后以后台的方式运行镜像。
Supervisor使用详解
Docker容器内多进程管理(一)——supervisor