docker - Docker 容器不运行 crontab
问题描述
我有一个基于 ubuntu 的 dockerfile 映像。我试图让 bash 脚本每天运行,但 cron 永远不会运行。当容器运行时,我检查 cron 是否正在运行。bash 脚本运行良好,并且 crontab 命令很好地复制到了容器内。我似乎无法找到问题出在哪里。
这是 Dockerfile:
FROM snipe/snipe-it:latest
ENV TZ=America/Toronto
RUN apt-get update \
&& apt-get install awscli -y \
&& apt-get clean \
&& apt-get install cron -y \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir /var/www/html/backups_scripts /var/www/html/config/scripts
COPY config/crontab.txt /var/www/html/backups_scripts
RUN /usr/bin/crontab /var/www/html/backups_scripts/crontab.txt
COPY config/scripts/backups.sh /var/www/html/config/scripts
CMD ["cron","-f"]
最后一个命令 CMD 不起作用。一旦我删除了 cmd 命令,当我检查容器内的 cron 任务时,我就会收到此消息:
root@fcfb6052274a:/var/www/html# /etc/init.d/cron status
* cron is not running
即使我在 crontab 之前启动 cron 进程,crontab 仍然没有启动
此 dockerfile 由 docker swarm 文件(组合文件类型)调用。也许必须使用撰写文件激活 cron。
我该如何解决这个问题???谢谢
解决方案
您需要以不同的方式处理此问题,因为您必须记住容器映像和容器不是虚拟机。它们是一个在其生命周期中启动和维护的单一过程。因此,容器中不存在后台进程(如 cron)。
我看到大多数人所做的就是让容器执行您希望它在某项工作中执行的任何操作do_the_thing.sh
,然后docker run
在主机上使用命令通过 cron 调用它。
因此,为了争论,假设您有一个名为 myrepo/task 的图像,其默认入口点为do_the_thing.sh
在主机上,您可以向 crontab 添加一个条目:
# m h dom mon dow user command
0 */2 * * * root docker run --rm myrepo/task
然后就是设计问题了。如果任务需要文件,您可以通过卷传递它们。如果它需要在完成后将某些东西放在某个地方,也许看看 blob 存储。
推荐阅读
- javascript - 如何在节点 js 中检查文本框 id 是否为空
- azure-machine-learning-service - 如何从本地部署的 AzureML 容器中公开端口?
- reactjs - 如果它在对象内部,如何更新 redux reducer 中的值
- javascript - React-select {creatable} 与用户输入的条目一起工作,因为只显示没有选项
- firebase - 是否可以将通配符与斜杠之间的其他文本或通配符组合为 Firestore 规则中 get() 或 exists() 路径的一部分?
- json - Powershell - 大括号内大括号的 JSON 语法
- php - 我如何检索发布帖子的用户
- angular - 延迟加载模块子级的角度路由问题
- powershell - 有没有办法检查当前的 Powershell 脚本是否正在通过 WinRM/PS Remoting 会话执行?
- javascript - Lodash 或将两个对象数组与匹配键组合的最佳方法