Docker容器中的cronjob没有运行,抛出Dockerfile错误

3
当我运行docker容器时,cronjob服务正在运行,但是cronjob未按计划执行。我想实现的是在不连接卷的情况下达到目标。
Dockerfile
FROM node:8.9.1         
RUN apt update && apt-get install -y cron vim
RUN mkdir app
WORKDIR /srv/image-server/current/
COPY . .
RUN  npm i 
RUN  cd /tmp && touch abc && mkdir test
ENTRYPOINT  sh start.sh

并分享 start.sh

#!/bin/sh
set -e
/etc/init.d/cron start
echo "* * * * * rm -rf /tmp/*" >> /var/spool/cron/crontabs/root
echo "#" >> /var/spool/cron/crontabs/root
/etc/init.d/cron status
node server.js
3个回答

3

似乎没有创建日志文件,请先创建一个空的日志文件,然后重新运行它。

尝试使用此Dockerfile,我已经测试过并且cron已成功运行。

FROM node:8.9.1         
RUN apt update 
RUN apt-get install cron vim -y
RUN mkdir app && touch /var/log/mylog.log
WORKDIR /srv/image-server/current/
COPY ./cronjob /etc/cron.d/container_cronjob
COPY . /srv/image-server/current/
RUN  npm i 
RUN chmod 644 /etc/cron.d/container_cronjob
RUN chmod 777 start.sh
CMD cron && node server.js

我已经将定时任务存储在crontab中

* 0 * * * root /srv/image-server/current/start.sh >> /var/log/cron.log 2>&1

以下是start.sh文件的内容:

rm -rf /tmp/*

1
似乎镜像 node:8.9.1 没有安装 crontab
将你的 Dockerfile 改为以下内容:
FROM node:8.9.1         
RUN apt update && apt-get install -y cron vim
RUN mkdir app
WORKDIR /srv/image-server/current/
COPY . .
RUN chmod +x start.sh
RUN  npm i 
RUN  cd /tmp && touch abc && mkdir test
ENTRYPOINT  sh start.sh

现在,当您重新构建镜像并再次运行时,您的文件和cronjobs应该正常工作。

当容器运行时,cron服务正在运行,但是cron作业没有被执行。 - Parth Shah
我认为那是由于文件权限的问题,我编辑了我的回答,请再次检查。 - Saeed
我不是JS开发人员,但请尝试以下操作并查看日志。运行 docker ps -a 命令,然后获取已退出容器的名称。现在运行 docker logs NAME 命令并查看错误,或者编辑您的问题并在此通知我。 - Saeed

1

在一个正在工作的用户定时任务表的顶部有一条独特的行:

head -n1 /var/spool/cron/crontabs/root
# DO NOT EDIT THIS FILE - edit the master and reinstall.

因此,如果您缺乏应对意外问题的欲望,最好遵循建议。特别是因为有几种方法可以完成工作:
  1. 将该作业编写在/etc/cron.d/somefile中:
# The syntax for this file is slightly different
# It requires you to write which user should run the job
#     m h dom mon dow user  command
echo "* * *   *   *   root  rm -rf /tmp/*" > /etc/cron.d/somejob

将作业写入文本文件,然后使用 crontab 导入:
echo "* * * * * rm -rf /tmp/*" > /tmp/crontab.txt
crontab /tmp/crontab.txt
# or, to import for specific user:
# crontab -u $USERNAME /tmp/crontab.txt
rm /tmp/crontab.txt

此外,我想补充一点,在Dockerfile中硬编码cronjobs会在修改时变得非常麻烦。您必须重新构建镜像以实现更改并将新镜像推送到节点。如果出现错误,您将不得不从头开始重复这个过程。因此,我开始将cron作业写入环境变量(docker-compose语法)中:
services:
  example:
    environment:
      CRON_USER: john  # <- they will have the crontab, root if undeclared
      CRONTAB: |
        # Now you can work with it like with a normal crontab

        PATH=/usr/bin:/bin
        FOO=bar
        * * * * * echo "I'm doing something useful" > /proc/1/fd/1

这段小代码将环境变量转换为crontab:
if [ -n "$CRONTAB" ]; then # e.g. if non-zero length
    echo "$CRONTAB" > /tmp/crontab.txt

    if [ -n "$CRON_USER" ]; then
        echo "Setting up crontab for user '$CRON_USER'..."
        crontab -u "$CRON_USER" /tmp/crontab.txt
    else
        echo "Setting up crontab for root..."
        crontab /tmp/crontab.txt
    fi

    rm /tmp/crontab.txt
fi


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接