docker cron 不工作

docker cron 不工作

我正在尝试构建一个具有 cron 的 docker 镜像。cron 将从 docker 文件系统的特定位置删除文件。以下是我的 Dockerfile

FROM ubuntu:latest
MAINTAINER [email protected]

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

# Copy testfiles folder to docker container.
COPY ./testfiles /opt/

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

RUN (crontab -l -u root; echo "* * * * * root rm -rf /opt/*") | crontab

# Run the command on container startup
CMD cron

ENTRYPOINT ["/bin/sh", "-c", "/bin/bash"]

一切成功。我的cron也在容器中设置

roadrunner:test shailesh$ docker run -it crontest /bin/bash
root@ac31f5acc49f:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@ac31f5acc49f:/# crontab -l
* * * * * root rm -rf /opt/*
root@ac31f5acc49f:/# cd /opt/
root@ac31f5acc49f:/opt# ls  
file1  file10  file11  file12  file13  file14  file15  file16  file17  file18  file19  file2  file20  file21  file22  file23  file24  file25  file3  file4  file5  file6  file7  file8  file9

但是它没有运行,并且删除了文件/opt/夹中的文件。有人能告诉我配置出了什么问题吗?

答案1

尝试这样的事情,

FROM ubuntu:latest
MAINTAINER [email protected]

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

# Add crontab file in the cron directory
ADD crontab /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

# Run the command on container startup
CMD cron && tail -f /var/log/cron.log

创建文件 crontab 并添加如下条目

* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1

希望对你有帮助!!!

答案2

您的 crontab 语法错误。

有两个地方可以放置 cron 文件:

  • 在用户自己的 crontab 文件中,通常在 下/var/spool/cron/USERNAME。如果您使用 命令 ,则会自动将内容放置在此处crontab
  • /etc/cron.d

如果您将其放在 中/etc/cron.d,则文件必须包含您运行它的用户的名称,因为否则文件和用户之间没有任何联系。但是如果您使用 命令crontab,cron 规范将放置在属于您的用户(或您在调用 时指定的用户crontab)的 crontab 中,因此您不需要包含用户名。

因此,要解决此问题,您可以执行以下两项操作之一:

  • 您可以从传递给 crontab 命令的字符串中删除用户名,使其看起来像这样:

    运行(crontab -l -u root;echo“* * * * * rm -rf /opt/*”)| crontab
  • 您可以将 crontab 条目放在下面的文件中/etc/cron.d,如下所示:

    运行(echo“* * * * * root rm -rf /opt/*”> /etc/cron.d/clearopt)

答案3

我也遇到了同样的问题。经过大量搜索和测试,我找到了这个解决方案:确保从 Dockerfile 安装“cron”。然后将以下几行添加到 Dockerfile:

ADD cron_start.sh /docker-entrypoint.d
ADD healthcheck.sh /docker-entrypoint.d

文件 cron_start.sh 仅包含以下几行:

#!/bin/bash
echo "Starting cron"
service cron start

然后添加此行以添加您的 Dockerfile 来创建 crontab 条目:

RUN (echo "* * * * * /docker-entrypoint.d/healthcheck.sh" | crontab -u root -)

请注意,如果您告诉 crontab 使用“-”标志从 stdin 获取数据,则不需要临时文件。

答案4

我在相同的上下文中遇到了相同的问题。我的建议是创建一个 bash 脚本,在容器启动时执行任何你想做的事情。
然后在 Dockerfile 中设置 CMD 以使用 JSON 数组语法运行它。

我有一个文件 start.sh 来做一些事情,我用&它在后台运行,然后我运行 cron && apache2-foregroung 来启动 cron 和 apache 服务器。

这是我的 Dockerfile 末尾的最后一条命令:

CMD ./start.sh > web/startup.log & cron && apache2-foreground

相关内容