我正在尝试构建一个具有 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