我正在尝试在 Docker 容器内运行 cron 来定期更新我的数据库、执行备份等。这是我的 cron 作业配置:
*/1 * * * * (. /app/.env.development; echo $DJANGO_COLOR) >> /var/log/cron.log 2>&1
*/1 * * * * (. /app/.env.development; /usr/local/bin/python3 /app/src/manage.py command) >> /var/log/cron.log 2>&1
*/1 * * * * (export $(cat /app/.env.development | grep -v "^#" | xargs); /usr/local/bin/python3 /app/src/manage.py command) >> /var/log/cron.log 2>&1
问题:
cron 作业不会从我的 Docker 容器继承环境变量。 我尝试使用
. /app/.env.development
加载环境变量,这适用于第一行,但由于某种原因,Django 服务器在第二行和第三行中运行时没有环境变量。
cronjob Dockerfile:
FROM app as cron
RUN apt-get update && apt-get -y install cron
# Copy hello-cron file to the cron.d directory
COPY cron/app-cron /etc/cron.d/app-cron
# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/app-cron
# Apply cron job
RUN crontab /etc/cron.d/app-cron
# Create the log file to be able to run tail
RUN touch /var/log/cron.log
入口点:
/bin/bash -c "cron && tail -f /var/log/cron.log"
您能解释一下为什么会发生这种情况吗?如何确保 cron 作业正确地从
.env
文件加载环境变量?
我用这个 cronjob 文件解决了它:
*/1 * * * * (/bin/bash -c '/app/src/cron-daily.sh') >> /var/log/cron.log 2>&1
这个脚本文件用作作业:
#!/bin/bash
# Export all variables from the .env.development file
set -o allexport
source /app/.env.development
set +o allexport
# Continue with what ever that needs your env variables
...