Tor*_*ory 12 cron docker docker-compose asp.net-core
作为序言,我一直在参考这两篇文章寻求帮助:
我的目标是在启动docker容器时自动启动cron作业.目前,它不会自动启动,但我可以手动进入我的容器并运行service cron start,这将启动作业,并且它可以正常工作.
所以问题是:当我的容器启动时,如何让我的cron作业自动启动?
Dockerfile
FROM microsoft/dotnet:latest
RUN apt-get update && apt-get install -y cron
COPY . /app
WORKDIR /app
ADD crontab /etc/cron.d/crontab
RUN chmod 0600 /etc/cron.d/crontab
RUN crontab -u root /etc/cron.d/crontab
RUN touch /var/log/cron.log
RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
EXPOSE 5000/tcp
CMD cron && tail -f /var/log/cron.log
CMD service cron start
Run Code Online (Sandbox Code Playgroud)
crontab中
* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
# Empty space
Run Code Online (Sandbox Code Playgroud)
虽然我无法让cron在该特定容器中工作,但我能够专门为cron创建一个独立的docker容器,并且成功地让它自动运行.
至于cron容器的设置,我按照链接的文章,使用Docker运行一个cron作业 - Julien Boulay,并且能够使它工作.
Alv*_*jal 11
我正在做的是像这样直接调用CMD调用cron:
CMD /usr/sbin/cron -f
Run Code Online (Sandbox Code Playgroud)
在此之前,我将crontab添加到容器中,并使用以下命令将其指定为root crontab:
RUN crontab /root/mycrontab
Run Code Online (Sandbox Code Playgroud)
您不需要对位于其中的文件调用crontab命令/etc/cron.d,但您确实需要这些文件具有正确的语法.使用您的示例,而不是:
* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
Run Code Online (Sandbox Code Playgroud)
你应该这样:
* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1
Run Code Online (Sandbox Code Playgroud)
在您的crontab文件上.这仅适用于位于其中的crontab文件/etc/cron.d,否则您的crontab文件语法是正确的,并使用该crontab命令加载它.
从您的示例开始,我认为您应该像这样修改文件:
Dockerfile
FROM microsoft/dotnet:latest
RUN apt-get update && apt-get install -y cron
COPY . /app
WORKDIR /app
ADD crontab /etc/cron.d/crontab
RUN chmod 0600 /etc/cron.d/crontab
RUN touch /var/log/cron.log
RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
EXPOSE 5000/tcp
CMD /usr/sbin/cron -f
Run Code Online (Sandbox Code Playgroud)
crontab中
* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1
Run Code Online (Sandbox Code Playgroud)
另一种选择是:
Dockerfile
FROM microsoft/dotnet:latest
RUN apt-get update && apt-get install -y cron
COPY . /app
WORKDIR /app
ADD crontab /root/
RUN crontab /root/crontab
RUN touch /var/log/cron.log
RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
EXPOSE 5000/tcp
CMD /usr/sbin/cron -f
Run Code Online (Sandbox Code Playgroud)
crontab中
* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
Run Code Online (Sandbox Code Playgroud)
我们在php-fpm和 docker 上遇到了问题,我们的 cronjob 任务没有被执行。我们解决了两个问题:
crontab文件复制到 docker 容器中COPY config/custom-cron /etc/cron.d/custom-cron。问题是,我们的行尾是windows格式的。这确实破坏了我们的 crontab 文件,因为在将该文件复制到容器时不会转换此行结尾。CMD ["cron", "-f"]它确实阻塞了主php-fpm进程。这会导致在502 Bad gateway调用我们的 Web 应用程序时出错。最后,我们通过手动编辑 crontab 文件来实现它,同时构建 docker 镜像而不是复制粘贴,并使用 supervisord 在 docker 中运行多个任务。这应该适用于所有支持的操作系统。
FROM php:7.1.16-fpm
RUN apt-get update && apt-get install -y cron supervisor
# Configure cron
RUN crontab -l | { cat; echo "* * * * * echo 'Hello world' >> /var/log/cron-test.log 2>&1"; } | crontab -
# Configure supervisor
COPY config/supervisord.conf /etc/supervisor/supervisord.conf
Run Code Online (Sandbox Code Playgroud)
[supervisord]
logfile = /dev/null
loglevel = info
pidfile = /var/run/supervisord.pid
nodaemon = true
[program:php-fpm]
command = php-fpm
autostart = true
autorestart = true
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes = 0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes = 0
[program:cron]
command = cron -f
autostart = true
autorestart = true
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes = 0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes = 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18625 次 |
| 最近记录: |