如何在 cron 任务中访问 Docker 容器的环境变量?

cron 守护进程不读取容器启动时的环境变量,常见解法:启动脚本把 env 导出到文件(env > /etc/environment)让 cron 源它,或用 docker run -e 显式传入。本文给出可靠做法。

最佳实践
如何在 cron 任务中访问 Docker 容器的环境变量?封面

问题本质:容器创建环境可被进程及其子进程继承;cron通常按自身实现重新构造任务环境,不保证把守护进程环境完整传给任务,所以 cron 任务里取不到。需要传递时只保存允许的变量,并按明确的数据格式加载;printenv输出不是可安全source的shell代码,值中空格、换行和特殊字符会出错。

症状

docker run -e DB_HOST=mysql myapp

容器里 echo $DB_HOST 有值,但 cron 任务里同样的变量是空的——cron 以最小环境启动任务。

解法一:导出环境到文件(推荐)

以下示例要求容器已安装Python3和cron,入口以root运行;仅传递非敏感DB_HOST,运行任务的用户必须有相应读取权限:

#!/bin/sh
set -eu
umask 077
mkdir -p /run/app
python3 - <<'PYENV'
import json, os
with open("/run/app/cron-env.json", "w", encoding="utf-8") as f:
    json.dump({key: os.environ[key] for key in ("DB_HOST",) if key in os.environ}, f)
PYENV
exec cron -f

用 /app/run-backup.py 读取数据并启动任务(路径按镜像实际解释器调整):

import json
import os
with open("/run/app/cron-env.json", encoding="utf-8") as f:
    values = json.load(f)
env = os.environ.copy()
env.update({key: value for key, value in values.items() if key == "DB_HOST" and isinstance(value, str)})
os.execve("/app/backup.sh", ["/app/backup.sh"], env)

root用户crontab使用五个时间字段;若写/etc/cron.d文件还需在命令前加root用户字段:

* * * * * /usr/local/bin/python3 /app/run-backup.py >> /var/log/backup.log 2>&1

解法二:crontab 里写死变量

直接在 crontab 顶部声明:

DB_HOST=mysql
0 3 * * * /app/backup.sh

适合变量少且固定的场景;变量来自编排系统时不适用。

解法三:任务命令里显式注入

0 3 * * * /usr/bin/env DB_HOST=mysql /app/backup.sh

解法四:让 PID 1 调度,绕开 cron

容器最佳实践倾向单进程。定时任务改用:

  • K8s CronJob:每个任务独立 Pod,环境变量天然注入
  • 应用内调度器:APScheduler(Python)、node-cron 等,进程内调度直接用进程环境
  • 宿主机 cron 调 docker exec:docker exec myapp /app/backup.sh,exec默认使用容器创建时的环境,不会自动读取PID1后来export的变量

任务应在完成时记录任务名、结果和执行时间,并区分失败与没有运行。若这些记录已采集到观测云,可按任务名创建日志检测;检测窗口应覆盖任务周期和允许延迟,先模拟一次失败验证告警。

常见问题(FAQ)

Q:为什么 docker exec 里能拿到变量而 cron 不行?
A:docker exec默认使用容器创建时记录的环境,也可用-e增加覆盖;cron任务环境由实现、配置和任务启动方式决定。

Q:/etc/profile.d/ 里的脚本 cron 会读吗?
A:不会。cron 不跑登录 shell,profile 系列文件都不生效。

Q:变量保密怎么处理的?
A:不要写进 crontab 明文;用 K8s Secret + CronJob,或由密管系统提供受控文件,只让任务用户读取;不要导出全部环境或把密钥当shell源码加载。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台