Docker化Python/Flask应用触发GitHub Action失败求助
核心问题
Flask应用在本地及云端虚拟机运行时可正常触发GitHub Action,Docker化后调用GitHub API返回401 Bad credentials,但进入容器执行curl命令却能成功。
可能原因及排查步骤
环境变量未正确传入容器
代码通过os.getenv('ACTION_TOKEN')获取令牌,需确认Docker容器内该环境变量是否有效:- 进入容器执行
echo $ACTION_TOKEN,检查输出是否为正确的GitHub令牌。 - 确认Docker运行命令(或docker-compose配置)是否通过
-e ACTION_TOKEN=ghp_xxx正确传递变量,无拼写错误。
- 进入容器执行
请求头格式异常
从返回日志可见,Accept头存在多余空格:application / vnd.github.everest - preview + json,正常格式应为application/vnd.github.everest-preview+json。GitHub API可能因无效的Accept头拒绝请求,即使令牌正确。
排查代码中GITHUB_ACTION_REQUEST_HEADER的构造逻辑,确保所有HTTP头格式规范,无多余空格或换行;同时验证Authorization字段是否正确拼接为token ${ACTION_TOKEN}(注意token后需有空格)。Docker缓存导致旧代码残留
若修改过环境变量或请求头逻辑但未重新构建镜像,容器可能仍运行旧版本代码。执行docker build --no-cache重新构建镜像,避免缓存干扰。curl与代码请求的参数差异
对比curl命令和代码的请求细节:- 确保curl使用的令牌与代码获取的
ACTION_TOKEN完全一致。 - 通过
curl -v查看请求头,与代码中GITHUB_ACTION_REQUEST_HEADER的内容做对比,确认Accept、Content-Type等字段无差异。
- 确保curl使用的令牌与代码获取的
验证建议
在代码中添加日志,打印脱敏后的完整GITHUB_ACTION_REQUEST_HEADER和GITHUB_ACTION_TOKEN,结合容器内环境变量检查,精准定位问题点。
内容的提问来源于stack exchange,提问作者Pavel Zagalsky

