251 words
1 minutes
在Docker Container中运行定时任务
Ubuntu
ubuntu中cron执行的命令所属的context和用户登陆之后是不一样的,所以很多时候会有一些意想不到的问题。
比如在aws ecs/lambda中运行的容器都自带了一些环境变量, 在cron中没有办法取到这些环境变量。 一个简单的方法是,在Dockerfile的entrypoint中执行一行命令将当前环境变量写入到文件中, 再在cron中导出这些环境变量。
FROM ubuntu
COPY script.sh /script.sh
RUN chmod 744 /script.sh
RUN echo "*/1 * * * * /script.sh >> /var/log/cron.log 2>&1" > /etc/cron.d/config-cron
RUN chmod 0644 /etc/cron.d/config-cron
RUN crontab /etc/cron.d/config-cron
RUN touch /var/log/cron.log
RUN touch /aws.env
ENV PORT=8080
EXPOSE ${PORT}
ENTRYPOINT bash /script.sh && cron && /gatus 2>&1
#!/bin/bash
echo "+++++++++++++++++++++++++++++++++++++"
export $(cat /aws.env | xargs)
env > /aws.env
/usr/local/bin/aws s3 cp s3://simcloud-aws-props-dev/uptime-gatus/config.yaml /config/config.yaml
echo "download success"
Alpine
Alpine的linux镜像执行cron更为简单,没有这些context不一致的问题,直接启动crond即可
FROM golang:alpine as builder
COPY script.sh /script.sh
RUN touch /var/log/cron.log
RUN touch /aws.env
RUN chmod +x /script.sh
RUN echo '*/1 * * * * /script.sh >> /var/log/cron.log 2>&1' > /etc/crontabs/root
ENV PORT=8080
EXPOSE ${PORT}
CMD crond
在Docker Container中运行定时任务
https://blog.ivyxjc.com/posts/cron-job-in-docker-container/