我想以分离模式在docker容器中运行python cron作业。我的设置如下:
我的python脚本是test.py
#!/usr/bin/env python import datetime print "Cron job has run at %s" %datetime.datetime.now()
我的cron文件是my-crontab
* * * * * /test.py > /dev/console
而我的Dockerfile是
FROM ubuntu:latest RUN apt-get update && apt-get install -y software-properties-common python-software-properties && apt-get update RUN apt-get install -y python cron ADD my-crontab / ADD test.py / RUN chmod a+x test.py RUN crontab /my-crontab ENTRYPOINT cron -f
这种方法潜在的问题是什么?还有其他方法,它们的优缺点是什么?
我在尝试使cron作业在docker容器中运行时遇到的几个问题是:
列表中存在特定于cron的问题和特定于docker的问题,但是无论如何都必须解决它们以使cron正常工作。
为此,我目前对问题提出的解决方案如下:
创建一个docker卷,在cron下运行的所有脚本都将写入其中:
# Dockerfile for test-logs # BUILD-USING: docker build -t test-logs . # RUN-USING: docker run -d -v /t-logs --name t-logs test-logs # INSPECT-USING: docker run -t -i --volumes-from t-logs ubuntu:latest /bin/bash FROM stackbrew/busybox:latest # Create logs volume VOLUME /var/log CMD ["true"]
将在cron下运行的脚本是test.py:
test.py
#!/usr/bin/env python # python script which needs an environment variable and runs as a cron job import datetime import os test_environ = os.environ["TEST_ENV"] print "Cron job has run at %s with environment variable '%s'" %(datetime.datetime.now(), test_environ)
为了将环境变量传递给,我想在cron下运行,遵循托马斯的建议,并把一个crontab片段为每个脚本(或脚本组)的脚本,在需要的泊坞窗环境变量的/etc/cron.d一个占位符XXXXXXX,必须被设置。
/etc/cron.d
XXXXXXX
# placed in /etc/cron.d # TEST_ENV is an docker environment variable that the script test.py need TEST_ENV=XXXXXXX # * * * * * root python /test.py >> /var/log/test.log
除了直接调用cron之外,还可以将cron包装在执行以下操作的python脚本中:1.从docker环境变量读取环境变量,并将环境变量设置为crontab片段。
#!/usr/bin/env python # run-cron.py # sets environment variable crontab fragments and runs cron import os from subprocess import call import fileinput # read docker environment variables and set them in the appropriate crontab fragment environment_variable = os.environ["TEST_ENV"] for line in fileinput.input("/etc/cron.d/cron-python",inplace=1): print line.replace("XXXXXXX", environment_variable) args = ["cron","-f", "-L 15"] call(args)
该Dockerfile说的容器,其中cron作业运行如下:
Dockerfile
# BUILD-USING: docker build -t test-cron . # RUN-USING docker run --detach=true --volumes-from t-logs --name t-cron test-cron FROM debian:wheezy # # Set correct environment variables. ENV HOME /root ENV TEST_ENV test-value RUN apt-get update && apt-get install -y software-properties-common python-software-properties && apt-get update # Install Python Setuptools RUN apt-get install -y python cron RUN apt-get purge -y python-software-properties software-properties-common && apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* ADD cron-python /etc/cron.d/ ADD test.py / ADD run-cron.py / RUN chmod a+x test.py run-cron.py # Set the time zone to the local time zone RUN echo "America/New_York" > /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata CMD ["/run-cron.py"]
最后,创建容器并运行它们:
docker build -t test-logs .
docker run -d -v /t-logs --name t-logs test-logs
docker build -t test-cron .
docker run --detach=true --volumes-from t-logs --name t-cron test-cron
docker run -t -i --volumes-from t-logs ubuntu:latest /bin/bash
/var/log