我写过一个非常小的程序,主要由Scrapy刮刀组成。我将它打包在一个docker容器中,需要cron调用刮刀。
我的docker-compose文件是:
version: '2'
services:
admin-panel:
env_file: ./Admin-Panel/.env
build: ./Admin-Panel/
volumes:
- ./Admin-Panel/app:/code/app
- ./Admin-Panel/flaskadmin.py:/code/flaskadmin.py
ports:
- "5000:5000"
scraper:
env_file: ./Admin-Panel/.env
build: ./Scraper/
volumes:
- ./Scraper/spiders:/spiders
我的Scraper Dockerfile是:
FROM ubuntu:latest
ENV TERM xterm
RUN apt-get update
RUN apt-get install -y python3-pip python3.5-dev build-essential
RUN apt-get install -y libssl-dev nano cron libpq-dev libffi-dev curl
ADD ./requirements /requirements
ADD crontab /etc/cron.d/scrapers
RUN pip3 install --upgrade pip
RUN pip3 install -r /requirements/base.txt
RUN touch /var/log/cron.log
CMD cron && tail -f /var/log/cron.log
我的crontab是(带有一个尾随的新行):
* * * * * root /usr/local/bin/scrapy runspider /spiders/myspider.py
* * * * * root /bin/date >> /tmp/cron_output
当我在运行Sierra的Mac上本地运行时,这非常有效。但是当我在运行Amazon Linux AMI的Amazon EC2实例上运行时,crons不会被调用。我使用Filezilla将文件从我的Mac传输到我的Amazon EC2实例。
AWS EC2:
Docker版本1.12.6,内部版本7392c3b / 1.12.6
我的MacBook:
Docker版本17.03.0-ce,build 60ccb22
如果我添加行
* * * * * root /bin/date >> /tmp/cron_output
使用crontab -e也没有任何反应。文件cron.log为空。
更新:
我安装了rsyslog然后启动它:
service rsyslog start
现在在/ var / log / syslog
中Mar 25 21:49:01 4406b0e05b9f CRON [464]:无法为指定会话制作/删除条目
答案 0 :(得分:1)
我终于通过https://github.com/sameersbn/docker-gitlab/issues/173
找到了解决方案我在/etc/pam.d/cron
中注释掉了以下这一行session required pam_loginuid.so
只需要在docker-compose上自动解决如何自动执行此操作。
答案 1 :(得分:0)
尝试向Dockerfile添加权限,例如
RUN chmod 0744 /spiders/myspider.py /etc/cron.d/scrapercron
并更改crontab的位置
ADD scrapercron /etc/cron.d
然后在你的crontab中......
HOME=/spiders
* * * * * root /spiders/myspider.py >> /tmp/cron_output 2>&1
要测试,请尝试输出到该tmp文件
CMD cron && tail -f /tmp/cron_output