GitLab CI运行私有仓库Docker容器提示Python脚本不存在问题求助
问题排查与解决方案
无CMD配置的合理性说明
你的实现没有问题:将ENTRYPOINT设为python,运行容器时动态传入脚本路径的方式完全符合灵活调用任意脚本的需求,没有逻辑错误。
报错根因定位
报错提示/autom/scripts/iYamlGenerator/exec/generate.py不存在,本质是你挂载到容器内/autom目录的CI任务工作目录中,不存在该路径的文件。你启动容器时添加的-v $(pwd):/autom:z参数会覆盖Docker镜像内/autom目录下的所有内容,哪怕镜像构建时已经把脚本COPY到镜像内,挂载后也会被宿主机当前目录的内容替换,可按以下步骤逐一排查:
步骤1:新增调试命令确认CI工作目录文件结构
修改你的.gitlab-ci.yml中generate-dev-repo的script段,先打印目录结构验证文件是否存在:
script: # 新增以下调试命令 - echo "当前工作目录路径:$(pwd)" - ls -la $(pwd) - echo "目标脚本路径拼接结果:${GENERATOR_SCRIPTS_DIR}/exec/generate.py" - ls -la ${GENERATOR_SCRIPTS_DIR}/exec/ || echo "目标脚本目录不存在" # 原有的docker run命令 - docker run --rm -e USER=$(id -u) -e GROUP=$(id -g) -v $(pwd):/autom:z registry.gitlab.<domain.tld>/<team>/<project>/python39-yaml ${GENERATOR_SCRIPTS_DIR}/exec/generate.py
运行流水线查看调试输出,确认目标脚本是否真的存在于CI的工作目录中。
步骤2:常见问题修复方案
根据调试结果对应修复:
- 情况1:CI工作目录下无scripts目录
首先确认当前运行流水线的分支下,是否已经把scripts目录提交到GitLab仓库:本地测试时你本地有该目录,但若未push到对应分支,CI拉取代码时自然没有对应文件。
若scripts是其他仓库的子模块:需要在CI的before_script中新增子模块拉取命令git submodule update --init --recursive,默认GitLab CI不会自动拉取子模块代码。
另外你当前的流水线触发规则仅匹配.gitlab-ci.yml和PROJECT_REPO下的yml文件变动,若你修改了scripts目录的内容,需要手动触发流水线,或者调整rules规则加入scripts目录的变动匹配。 - 情况2:路径拼接错误
若调试输出的GENERATOR_SCRIPTS_DIR变量值不符合预期,检查变量定义是否有拼写错误,注意GitLab CI若存在同名的项目级/组级变量,会覆盖你在yaml中定义的变量值,需要调整优先级。 - 情况3:Docker挂载路径异常(仅当你用Docker Executor的Runner时出现)
若你的testcentos23 Runner是Docker Executor而非Shell Executor,你在Job内执行docker命令属于Docker-in-Docker场景,此时$(pwd)是Runner容器内部的路径,直接挂载会映射到宿主机的对应路径而非Runner容器内的路径,解决方案:- 更换为Shell Executor的Runner(和你本地测试环境一致)
- 或者去掉
-v $(pwd):/autom:z挂载参数,直接使用镜像内COPY进去的脚本文件。
快速验证方案
如果想快速验证是不是挂载导致的问题,可以先去掉挂载参数运行,看是否能正常执行镜像内的脚本:
docker run --rm -e USER=$(id -u) -e GROUP=$(id -g) registry.gitlab.<domain.tld>/<team>/<project>/python39-yaml ${GENERATOR_SCRIPTS_DIR}/exec/generate.py
如果去掉挂载后可以正常运行,就可以完全确认是CI工作目录下没有对应文件导致的,按上面的步骤修复即可。
内容的提问来源于stack exchange,提问作者user2569854
相关产品推荐
相关产品推荐

