You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GitLab CI流水线的Docker镜像中使用PyPI包?

解决GitLab私有PyPI包在Docker镜像中的依赖配置问题

问题场景

通过两个GitLab CI任务将base-package推送到仓库的私有PyPI注册表,现在需要基于同仓库的Dockerfile和requirements.txt构建镜像,要求镜像包含该私有包,且方案需支持跨仓库依赖(即其他项目流水线拉取此私有包),核心难点是私有PyPI注册表的认证处理。

解决方案

1. 基础requirements.txt配置

直接在requirements.txt中声明私有包的名称和版本(无需额外源配置,源信息在Docker构建时指定):

base-package==1.0.0  # 替换为实际版本号

2. Dockerfile优化(处理认证与依赖安装)

通过构建参数传入认证令牌和私有PyPI源地址,直接在pip命令中携带认证信息,安装完成后无需额外清理(命令参数不会保留在镜像中):

FROM python:slim

# 接收构建参数:认证令牌、私有PyPI源地址
ARG CI_JOB_TOKEN
ARG PYPI_REGISTRY_URL

# 安装依赖,携带私有源认证信息
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt \
    --extra-index-url https://gitlab-ci-token:${CI_JOB_TOKEN}@${PYPI_REGISTRY_URL#https://}

3. GitLab CI流水线配置

同仓库依赖场景(用CI_JOB_TOKEN自动认证)

CI_JOB_TOKEN由GitLab自动生成,仅对当前项目有效,无需手动创建令牌:

build-docker-image:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  tags:
    - myrunner
  variables:
    # 当前项目的私有PyPI源地址
    PYPI_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi/simple"
    IMAGE_NAME: "${CI_REGISTRY_IMAGE}/my-app"
  script:
    # 登录GitLab容器注册表(若需推送镜像)
    - docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
    # 构建镜像,传入认证令牌和源地址
    - docker build --build-arg CI_JOB_TOKEN=${CI_JOB_TOKEN} --build-arg PYPI_REGISTRY_URL=${PYPI_REGISTRY_URL} -t ${IMAGE_NAME}:${CI_COMMIT_SHA} .
    - docker push ${IMAGE_NAME}:${CI_COMMIT_SHA}

跨仓库依赖场景(用PAT认证)

CI_JOB_TOKEN无法跨项目访问,需创建个人访问令牌(PAT):

  1. 在GitLab创建PAT,赋予read_api和read_repository权限
  2. 将PAT存入当前项目的CI/CD变量(命名为PRIVATE_PYPI_TOKEN)
  3. 修改CI任务配置:
build-docker-cross-project:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  tags:
    - myrunner
  variables:
    # 替换为目标项目的私有PyPI源地址
    PYPI_REGISTRY_URL: "https://gitlab.example.com/api/v4/projects/TARGET_PROJECT_ID/packages/pypi/simple"
    IMAGE_NAME: "${CI_REGISTRY_IMAGE}/my-app"
  script:
    - docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
    # 使用PAT作为认证令牌
    - docker build --build-arg CI_JOB_TOKEN=${PRIVATE_PYPI_TOKEN} --build-arg PYPI_REGISTRY_URL=${PYPI_REGISTRY_URL} -t ${IMAGE_NAME}:${CI_COMMIT_SHA} .
    - docker push ${IMAGE_NAME}:${CI_COMMIT_SHA}

关键注意事项

  • CI_JOB_TOKEN仅在当前流水线有效,自动过期,安全性更高,优先用于同项目场景
  • 跨项目必须使用PAT,需严格控制权限,且禁止硬编码,必须存入CI/CD变量
  • Docker构建时的ARG参数不会被保留在最终镜像中,无需担心令牌泄露

内容的提问来源于stack exchange,提问作者rbaleksandar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 02:52:51