Рабочий проект Poetry с частными зависимостями внутри DockerPython

Программы на Python
Ответить
Anonymous
 Рабочий проект Poetry с частными зависимостями внутри Docker

Сообщение Anonymous »

У меня есть библиотека Python, размещенная в реестре артефактов Google Cloud Platform. Кроме того, у меня есть проект Python, использующий Poetry, который зависит от библиотеки.
Это файл моего проекта pyproject.toml:
< pre class="lang-ini Prettyprint-override">

Код: Выделить всё

[tool.poetry]
name = "Test"
version = "0.0.1"
description = "Test project."
authors = [
"Me "
]

[tool.poetry.dependencies]
python = ">=3.8,=1.1.0"]
build-backend = "poetry.core.masonry.api"

[[tool.poetry.source]]
name = "my-lib"
url = "https://us-east4-python.pkg.dev/my-gcp-project/my-lib/simple/"
secondary = true

Чтобы включить использование моего частного репозитория, я установил интерфейс командной строки gcloud и прошел аутентификацию с использованием своих учетных данных. Поэтому, когда я запускаю эту команду, я вижу правильные результаты, например:

Код: Выделить всё

$ gcloud auth list
ACTIVE  ACCOUNT
...
*       @appspot.gserviceaccount.com
...
Кроме того, я использую связку ключей Python вместе с keyrings.google-artifactregistry-auth, как вы можете видеть в файле проекта.
Итак, , с этой настройкой я могу запустить установку поэзии, зависимость загружается из моего частного реестра артефактов с использованием аутентификации из GCP.

Проблема возникает, когда я пытаюсь применить те же принципы внутри контейнер Docker.
Я создал файл Docker следующим образом:

Код: Выделить всё

# syntax = docker/dockerfile:1.3
FROM python:3.9

# Install Poetry
RUN curl -sSL https://install.python-poetry.org | python3 -
ENV PATH "${PATH}:/root/.local/bin"

# Install Google Cloud SDK CLI
ARG GCLOUD_VERSION="401.0.0-linux-x86_64"
RUN wget -q https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-${GCLOUD_VERSION}.tar.gz && \
tar -xf google-cloud-cli-*.tar.gz && \
./google-cloud-sdk/install.sh --quiet && \
rm google-cloud-cli-*.tar.gz
ENV PATH "${PATH}:/google-cloud-sdk/bin"

# install Google Artifact Rrgistry keyring integration
RUN pip install keyrings.google-artifactregistry-auth
RUN --mount=type=secret,id=GOOGLE_APPLICATION_CREDENTIALS ${GOOGLE_APPLICATION_CREDENTIALS} gcloud auth activate-service-account --key-file=/run/secrets/GOOGLE_APPLICATION_CREDENTIALS
RUN gcloud auth list
RUN keyring --list-backends

WORKDIR /app

# copy Poetry project files and install dependencies
COPY ./.env* ./
COPY ./pyproject.toml ./poetry.lock* ./
RUN poetry install

# copy source files
COPY ./app /app/app

# run the program
CMD poetry run python -m app.main

Как видите, я внедрил файл учетных данных Google, следуя этой документации. Это работает. Я использовал секреты Docker BuildKit, как показано здесь (вопросы безопасности не являются предметом этого вопроса). Итак, когда я пытаюсь создать образ, я получаю ошибку аутентификации (

Код: Выделить всё

GOOGLE_APPLICATION_CREDENTIALS
настроен правильно, указывая на действительный файл ключа):

Код: Выделить всё

$ DOCKER_BUILDKIT=1 docker image build --secret id=GOOGLE_APPLICATION_CREDENTIALS,src=${GOOGLE_APPLICATION_CREDENTIALS} -t app-test .

...
#19 66.68 Source (my-lib): Authorization error accessing https://us-east4-python.pkg.dev/my-gcp-project/my-lib/simple/mylib/
#19 68.21
#19 68.21   RuntimeError
#19 68.21
#19 68.22   Unable to find installation candidates for mylib (0.1.1)
...
Если я выполняю построчно все команды в Dockerfile, используя тот же файл ключей учетных данных Google вне Docker, все работает.
Я даже пытался выполнить отладку внутри образа, не выполняя команды поэтической установки и поэтического запуска..., и я увидел это, если это помогает отладке:

Код: Выделить всё

# gcloud auth list
Credentialed Accounts
ACTIVE  ACCOUNT
*       @appspot.gserviceaccount.com

Код: Выделить всё

# keyring --list-backends
keyrings.gauth.GooglePythonAuth (priority: 9)
keyring.backends.chainer.ChainerBackend (priority: -1)
keyring.backends.fail.Keyring (priority: 0)
Наконец, я даже попробовал использовать этот подход: использование Keyring в безголовых системах Linux в контейнере Docker, с теми же результатами:

Код: Выделить всё

# apt update
...
# apt install -y gnome-keyring
...
# dbus-run-session -- sh
GNOME_KEYRING_CONTROL=/root/.cache/keyring-MEY1T1
SSH_AUTH_SOCK=/root/.cache/keyring-MEY1T1/ssh
# poetry install
...
• Installing mylib (0.1.1): Failed

RuntimeError

Unable to find installation candidates for mylib (0.1.1)

at ~/.local/share/pypoetry/venv/lib/python3.9/site-packages/poetry/installation/chooser.py:103 in choose_for
99│
100│             links.append(link)
101│
102│         if not links:
→ 103│             raise RuntimeError(f"Unable to find installation candidates for {package}")
104│
105│         # Get the best link
106│         chosen = max(links, key=lambda link: self._sort_key(package, link))
107│
...

Я даже пытался следовать советам другого вопроса. Безуспешно. CLI работает внутри контейнера, тестируя другие команды. Я предполагаю, что интеграция с Keyring не работает должным образом, но я не знаю, как ее отладить.
Как мне разрешить мою зависимость внутри контейнера Docker?

Подробнее здесь: https://stackoverflow.com/questions/741 ... ide-docker
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»