cronjob 不是 运行 在 Docker 容器中抛出 Docker 文件

cronjob is not running in Docker container throw Dockerfile

我在 运行 docker 容器中遇到问题,cronjob 服务正在 运行ning 但 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

似乎图像 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 应该在您重建映像并再次 运行 时工作。

正在工作的 用户 crontab 的顶部有一行奇怪的代码:

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
  1. 将作业写入文本文件,然后使用 crontab:
  2. 导入
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

另外,我想补充一点,当涉及到更改时,将 cronjobs 硬编码到 Dockerfile 中是相当烦人的。您必须重建图像以实施更改并将新图像推送到节点。上帝保佑您不要在这里犯错,否则您将不得不从头开始重复。因此,我开始将 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

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

试试这个我已经测试过的 dockerfile,crons 运行ning 成功了。

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

我已将 crons 存储在 crontab 中

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

这里是start.sh文件内容

rm -rf /tmp/*