首页 > 解决方案 > 在 Python cronjob 中设置 Docker 环境变量

问题描述

关于我的问题,我已经看到了多个关于 SO 的问题,但似乎没有一个解决方案有效。我有一个运行 python 脚本 cronjob 的 Docker 容器,目前我希望它每分钟运行一次。由于某种原因,它无法捕获环境变量。

我的环境变量设置在 .env 文件中。我有一个 docker compose 文件,它将 .env 文件读入 cron 容器。为了缩短长度,我不会发布 docker compose 或 .env 文件。

这是我用于 cron 容器的 Dockerfile,cronpy它定义了 cronjob:

FROM python:3.9.0
ENV PYTHONUNBUFFERED 1
RUN apt-get update &&\
    apt-get install -y libldap2-dev\
                       libsasl2-dev\
                       xmlsec1\
                       cron &&\
    pip install --upgrade --trusted-host pypi.org --trusted-host files.pythonhosted.org pip

RUN mkdir /code
WORKDIR /code

COPY requirements.txt /code/
RUN pip install --upgrade --trusted-host pypi.org --trusted-host files.pythonhosted.org -r requirements.txt

COPY . /code/
COPY ./cronpy /etc/cron.d/cronpy

# Apply cron job
RUN crontab /etc/cron.d/cronpy

ENTRYPOINT ["/code/config/cron.sh"]

在我的入口点脚本中,我创建了一个cron_env.sh包含我需要的所有环境变量的新脚本:

#!/usr/bin/env bash
set +e
set +x

env > cron_config

rm -f cron_env.sh

while read -r assignment; do
  echo "export ${assignment}" >> cron_env.sh
done < cron_config

chmod 755 cron_env.sh
rm -f cron_config

cron -f

然后,在我的 cronpy 文件中,我在运行命令之前获取变量:

* * * * * root . /code/cron_env.sh; /usr/local/bin/python /code/manage.py capture_usage_metrics --type all > /proc/1/fd/1 2>&1

我仍然收到未设置环境变量的错误。该cron_env.sh文件正在创建良好。

标签: pythondockercron

解决方案


我弄清楚了这个问题。其中一个环境变量有特殊字符,导致cron_env.sh脚本失败。


推荐阅读