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.
因此,如果您缺乏与意想不到的问题作斗争的意愿,最好听从建议。特别是因为有几种方法可以完成工作:
- 在
/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
另外,我想补充一点,当涉及到更改时,将 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/*
我在 运行 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.
因此,如果您缺乏与意想不到的问题作斗争的意愿,最好听从建议。特别是因为有几种方法可以完成工作:
- 在
/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
另外,我想补充一点,当涉及到更改时,将 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/*