我已经使用docker几个月了,我正在开发各种不同的服务器映像。一个一致的问题是许多服务器需要运行cron作业。网上有很多讨论(包括Stackoverflow),但我并不完全理解它的机制。
目前,我正在使用主机的cron和docker exec进入每个容器来运行脚本。我创建了一个关于脚本名称和位置的约定;我的所有容器都有相同的脚本。这样可以避免使用主机的cron,具体取决于容器。
基本上,每分钟一次,主持人的cron会这样做:
for each container
docker exec -it <containername> /cronscript/minute-script
这样可行,但会使容器依赖主机。
我想要做的是创建一个cron容器,在每个其他容器中启动一个脚本 - 但我不知道等同于#34; docker exec&#34;从一个容器到另一个容器。
我现在遇到的具体情况是在MySQL容器中运行备份,并且运行cron作业Moodle需要每分钟运行一次。最终,我还需要通过cron做更多的事情。 Moodle使用命令行PHP脚本。
什么是&#34;适当的&#34; dockerized方法从另一个容器中的一个容器启动脚本?
更新:也许提及我的具体用例会有所帮助,但随着时间的推移,会有更多用例。
目前,cron需要执行以下操作:
答案 0 :(得分:8)
我的解决方案是:
我的Dockerfile
FROM debian:jessie
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY .crontab /usr/src/app
# Set timezone
RUN echo "Europe/Warsaw" > /etc/timezone \
&& dpkg-reconfigure --frontend noninteractive tzdata
# Cron, mail
RUN set -x \
&& apt-get update \
&& apt-get install -y cron rsyslog mailutils --no-install-recommends \
&& rm -rf /var/lib/apt/lists/*
CMD rsyslogd && env > /tmp/crontab && cat .crontab >> /tmp/crontab && crontab /tmp/crontab && cron -f
cron
软件包 - 包含cron守护程序的软件包rsyslog
包以记录cron任务输出mailutils
包
rsyslogd
.crontab
文件(包含您的任务)附加到tmp文件我在容器中使用它并且工作得非常好。
如果你喜欢这个范例,那么每个cron任务一个Dockerfile
。 e.g。
Dockerfile
- 主程序Dockerfile_cron_task_1
- cron task 1 Dockerfile_cron_task_1
- cron task 2 并构建所有容器:
docker build -f Dockerfile_cron_task_1 ...