GitLab流水线运行接收文件输入的自定义Python镜像问题咨询
原因分析
你在project1的Dockerfile里使用了ENTRYPOINT ["python","app.py"],而GitLab CI运行job时,会把script段内的所有命令打包成sh -c "..."的形式,再将这个完整的shell命令作为参数传递给镜像的ENTRYPOINT。实际运行的命令等价于:
python app.py sh -c "echo 'Creating Tag'; ...; python app.py hi.sql yes.sql hello.sql"
所以app.py遍历sys.argv时,会把sh、-c以及后续整个shell脚本内容都打印出来,而非你预期的hi.sql yes.sql hello.sql。
修复方案
两种可选方案,任选其一即可:
方案1:修改Dockerfile,将ENTRYPOINT替换为CMD
更新project1的Dockerfile:
FROM python:3.12.7-alpine WORKDIR /app COPY app.py . CMD ["python","app.py"]
GitLab CI的script命令会自动覆盖CMD,此时执行python app.py hi.sql yes.sql hello.sql就能正常传递参数。
方案2:在project2的CI脚本中直接传递参数
由于镜像ENTRYPOINT已经是python app.py,脚本最后一行无需重复写python app.py,直接传参数:
script: # 保留其他原有命令 - hi.sql yes.sql hello.sql
CI会将这些参数直接传递给ENTRYPOINT,app.py就能拿到正确的命令行参数。
可以访问。GitLab CI启动job容器时,会自动将project2的代码仓库克隆到容器默认工作目录(通常为/builds/<group>/<project2>)。你的镜像默认使用root用户(python alpine镜像默认用户),对该目录拥有读写权限,可直接操作仓库内的文件。
注意:镜像的WORKDIR设为/app,但CI代码存放在另一个目录,若要访问仓库文件,可在脚本中切换到CI工作目录(如cd $CI_PROJECT_DIR)、使用绝对路径指定文件,或把需要的文件复制到/app目录。
内容的提问来源于stack exchange,提问作者sandesh b nataraj

