Как установить пакет из репозитория пакетов Gitlab PyPI в Dockerfile?

Я запускаю следующую команду, чтобы установить пакет из частного репозитория Gitlab:

pip install -r requirements.txt --index-url https://username:[email protected] --cert /usr/local/share/ca-certificates/cert.crt

Это работает, но теперь я хочу сделать это в Dockerfile, чтобы оно могло работать в моем конвейере Gitlab.

Это мой Dockerfile: https://hastebin.com/share/ifirijonaj.bash но по причинам TLDR: он создает образ из python:3.12; Я добавляю имя пользователя, пароль и местоположение сертификата в качестве аргументов сборки Docker; Я копирую сертификат в местоположение сертификата и устанавливаю его; наконец, я запускаю приведенную выше команду.

Затем я создаю образ докера следующим образом:

docker build -t image_name --build-arg "PRIVATE_PYPI_USERNAME=username" --build-arg "PRIVATE_PYPI_PASSWORD=password" --build-arg "CA_CERTIFICATE_LOCATION=cert.crt" --progress=plain .

Мой Dockerfile выводит ${INDEX_URL}, который он строит правильно, но команда pip install выводит эту ошибку:

#20 [16/19] RUN pip install -r requirements.txt --index-url "https://username:[email protected]/api/v4/projects/9/packages/pypi/simple/" --cert /usr/local/share/ca-certificates/cert.crt --trusted-host private.gitlab.internal
#20 0.678 Using pip 24.0 from /usr/local/lib/python3.12/site-packages/pip (python 3.12)
#20 0.728 Looking in indexes: https://username:****@private.gitlab.internal/api/v4/projects/9/packages/pypi/simple/
#20 1.034 ERROR: Could not find a version that satisfies the requirement black==24.4.0 (from versions: none)
#20 1.035 ERROR: No matching distribution found for black==24.4.0
#20 ERROR: process "/bin/sh -c pip install -r requirements.txt --index-url \"${INDEX_URL}\" --cert /usr/local/share/ca-certificates/cert.crt --trusted-host private.gitlab.internal" did not complete successfully: exit code: 1
------
 > [16/19] RUN pip install -v -r requirements.txt --index-url "https://username:[email protected]/api/v4/projects/9/packages/pypi/simple/" --cert /usr/local/share/ca-certificates/cert.crt --trusted-host private.gitlab.internal:
0.678 Using pip 24.0 from /usr/local/lib/python3.12/site-packages/pip (python 3.12)
0.728 Looking in indexes: https://username:****@private.gitlab.internal/api/v4/projects/9/packages/pypi/simple/
1.034 ERROR: Could not find a version that satisfies the requirement black==24.4.0 (from versions: none)
1.035 ERROR: No matching distribution found for black==24.4.0
------
Dockerfile:31
--------------------
  29 |     # Install
  30 |     RUN pip install --upgrade pip
  31 | >>> RUN pip install -v -r requirements.txt --index-url "${INDEX_URL}" --cert /usr/local/share/ca-certificates/cert.crt --trusted-host private.gitlab.internal
  32 |
  33 |     # Make sure environment variables can be read
--------------------
ERROR: failed to solve: process "/bin/sh -c pip install -v -r requirements.txt --index-url \"${INDEX_URL}\" --cert /usr/local/share/ca-certificates/cert.crt --trusted-host private.gitlab.internal" did not complete successfully: exit code: 1

Поэтому он пытается установить black==24.4.0, который является первой зависимостью в файле require.txt и (при условии, что он работает локально) существует в моем личном PyPI.

В чем может быть причина того, что процесс сборки Docker не может быть установлен по протоколу?

Я уже пробовал:

  • выполнение команды локально точно так же, как ее выводит процесс сборки докера

  • использование завитка для доступа к черному URL-адресу колеса из контейнера (с использованием `--cacert`), который работает правильно

  • разные перестановки --no-cache-dir, --trusted-host, --no-deps, --no-index и кавычек вокруг ${INDEX_URL}, но ни одна из них, похоже, не работает

🤔 А знаете ли вы, что...
Python был создан Гвидо ван Россумом и впервые выпущен в 1991 году.


55
1

Ответ:

Решено

Я решил свою проблему. Проблема заключалась в том, что в реестре пакетов не было дисков для нужной платформы, а были только те, которые я скачал локально (в Windows), а затем загрузил, тогда как нужные мне пакеты должны были быть собраны для Linux.

Добавление --platform manylinux2014_x86_64 --platform manylinux1_x86_64 --platform any в команду загрузки pip и последующая загрузка всех колес в реестр пакетов решило проблему.