Docker容器中Cronjob执行PHP脚本调用ChatGPT时API密钥缺失问题
解决方案
问题根源
Cron进程的环境变量集合与容器内交互式Shell的环境变量完全不同,默认仅加载极少的系统级变量——哪怕docker-compose.yaml中配置了环境变量,Cron也不会自动继承。另外Cron默认使用sh而非bash,直接使用source命令可能无法正常解析.env文件。
方案1:显式用Bash加载.env并执行脚本
修改Cron任务,使用绝对路径指定.env文件,并用bash -c包裹命令确保source生效:
@daily bash -c 'source /var/www/html/openAIKey.env && /usr/local/bin/php /var/www/html/Tests/example.php' >> /var/www/html/Tests/errPress.txt 2>&1
注意:必须替换
/var/www/html/openAIKey.env为你容器内.env文件的真实绝对路径,不要用相对路径(Cron默认工作目录并非脚本所在目录)。
方案2:让Cron继承Docker容器的环境变量
如果你的API Key已经在docker-compose.yaml中配置为环境变量,可以在Docker镜像构建时,将容器的环境变量写入Cron的环境配置文件:
在Dockerfile中添加以下命令:
RUN printenv | grep -v "no_proxy" >> /etc/environment
Cron执行时会自动加载/etc/environment中的变量,这样PHP脚本无需额外加载.env,直接读取环境变量即可。
方案3:修改PHP脚本使用绝对路径加载.env
如果你的PHP脚本使用vlucas/phpdotenv这类库加载.env,修改脚本中加载.env的代码,指定绝对路径:
// 修改为.env所在目录的绝对路径 $dotenv = Dotenv\Dotenv::createImmutable('/var/www/html/'); $dotenv->load();
这样无论脚本从哪个工作目录执行,都能准确找到.env文件。
内容的提问来源于stack exchange,提问作者Novik
相关产品推荐
相关产品推荐

