【问题标题】:Run a bash script as cron job in Docker container在 Docker 容器中将 bash 脚本作为 cron 作业运行
【发布时间】:2020-12-04 07:35:01
【问题描述】:

我想在 Docker 容器内定期运行一个 bash 脚本(我的工作基于这个答案:https://stackoverflow.com/a/37458519/6240756

这是我的脚本hello.sh


#!/bin/sh
echo "Hello world" >> /var/log/cron.log 2>&1

这里是 cron 文件hello-cron

# m h  dom mon dow   command
* * * * * /app/hello.sh
# Empty line

这是我的 Dockerfile:

FROM ubuntu:20.04

RUN apt-get update && apt-get install -y cron

# Add backup script
COPY hello.sh /app/
RUN chmod +x /app/hello.sh

# Configure the cron
# Copy file to the cron.d directory
COPY hello-cron /etc/cron.d/hello-cron

# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/hello-cron

# Apply cron job
RUN crontab /etc/cron.d/hello-cron

# Create the log file to be able to run tail
RUN touch /var/log/cron.log

# Start the cron
CMD cron && tail -f /var/log/cron.log

我构建并运行了容器,但没有任何反应。我应该每分钟都会看到“Hello world”。 如果我直接用echo "Hello world" >> /var/log/cron.log 2>&1 替换对 cron 文件中脚本的调用,它会起作用,我每分钟都会看到“Hello world”

我做错了什么?

编辑

还有 Docker 命令:

docker build -t hello-cron .
docker run -t -i hello-cron

【问题讨论】:

  • 你能把你的docker run 指令输入一下吗?
  • @mulg0r 查看编辑后的帖子
  • 与此问题无关,但cron 已经知道/etc/cron.d 中的文件;您不需要使用crontab 命令安装它们。这个目录中的文件确实需要一个额外的字段(用户名),所以* * * * * * root /app/hello.sh

标签: bash docker cron


【解决方案1】:

关于你的具体问题

问题是您使用-t -i 启动docker,而您想要的是后台执行并以交互方式检查它。

尝试:

docker run -d --name mycontainer hello-cron 
docker logs -f mycontainer

最佳做法

如果您要定期执行某项操作,请考虑它是否应该在运行状况检查定义中,您可以在其中设置周期和其他变量。

其次,请注意您的 cron.log 未挂载,因此,如果 docker 重新启动,您将丢失此信息。

【讨论】:

  • @larsks,我检查了我所说的。如果他这样做,他会得到日志。
  • 嗯,你可能是对的。事实证明我无论如何都无法重现该问题:)
  • 也许我们有不同的 docker 或 OS 版本。我的是 docker 19.03.8,ubuntu 20.04。无论如何,我希望我的回答对他有所帮助。看起来他和我有相同的版本,因为我们都可以复制它:)
猜你喜欢
  • 2014-11-22
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2014-11-11
  • 2016-08-29
  • 2016-09-24
相关资源
最近更新 更多