Установите пакет Python Artifact Registry из Dockerfile с помощью Cloud Build

У меня есть пакет Python, расположенный в моем репозитории реестра артефактов.

Мой шаблон Dataflow Flex упакован в образ Docker с помощью следующей команды:

gcloud builds submit --tag $CONTAINER_IMAGE .

Поскольку разработчики постоянно меняют исходный код конвейера, эта команда часто запускается с их компьютеров для пересборки образа.

Вот мой Dockerfile:

FROM gcr.io/dataflow-templates-base/python311-template-launcher-base

ARG WORKDIR=/template
RUN mkdir -p ${WORKDIR}
WORKDIR ${WORKDIR}

ENV PYTHONPATH ${WORKDIR}
ENV FLEX_TEMPLATE_PYTHON_SETUP_FILE = "${WORKDIR}/setup.py"
ENV FLEX_TEMPLATE_PYTHON_PY_FILE = "${WORKDIR}/main.py"

RUN pip install --no-cache-dir -U pip && \
    pip install --no-cache-dir -U keyrings.google-artifactregistry-auth

RUN pip install --no-cache-dir -U --index-url=https://europe-west9-python.pkg.dev/sample-project/python-repo/ mypackage

COPY . ${WORKDIR}/
    
ENTRYPOINT ["/opt/google/dataflow/python_template_launcher"]

Я получаю следующую ошибку:

ERROR: No matching distribution found for mypackage
error building image: error building stage: failed to execute command: waiting for process to exit: exit status 1

Я предполагаю, что процесс Cloud Build не имеет прав доступа. Я немного не понимаю, как получить их из Dockerfile.

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

Я думаю, это интересный вопрос. К сожалению, я не использовал реестр артефактов ни для чего, кроме образов контейнеров. Я думаю, вы хотите, чтобы ваш файл-контейнер был портативным, чтобы вы могли использовать Cloud Build и где угодно. По этой причине, я думаю (!?) лучшим решением будет смонтировать ключ и экспортировать GOOGLE_APPLICATION_CREDENTIALS. Тем не менее, вы не можете использовать, например, Создайте учетные данные Cloud Build и превратите их в учетные данные для монтирования. Итак, я думаю, вам захочется использовать Secret Manager, чтобы сохранить отдельный ключ и смонтировать его.

DazWilkin 30.06.2024 19:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
109
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Пожалуйста, проверьте этот пример: https://github.com/GoogleCloudPlatform/python-docs-samples/blob/main/dataflow/flex-templates/pipeline_with_dependentities/Dockerfile

Вам необходимо убедиться, что mypackage находится в вашем контейнере.

Я не уверен, что понимаю связь с этим решением и моей проблемой. Как вы сказали, мне нужно убедиться, что моя посылка находится в контейнере, прежде чем бежать pip install .. Но в этом и вся проблема, у меня проблемы с доступом к реестру артефактов, поэтому я не могу его установить. Если только вы не предлагаете установить пакет вручную (скопировав его из моей папки sites-packages). В этом случае я не считаю это решение очень чистым.

Grégoire Borel 08.07.2024 11:02
COPY my_package my_package вы можете просто сделать это.
XQ Hu 08.07.2024 17:10

Я не понимаю. Откуда берется my_package? Пакет, который я использую, установлен с помощью pip install и взят из реестра артефактов. Он не находится в моем локальном репозитории, поэтому я не могу его просто скопировать.

Grégoire Borel 08.07.2024 23:38

Я понимаю. pip install --no-cache-dir -U --index-url=https://europe-west9-python.pkg.dev/sample-proje‌​ct/python-repo/ mypackage : это работает локально?

XQ Hu 09.07.2024 18:54

Да, это так. Чтобы это работало локально, мне пришлось сделать pip install keyrings.google-artifactregistry-auth. Мне также пришлось добавить конфигурацию репозитория реестра артефактов в мой проект Python, следуя инструкциям этой команды: gcloud artifacts print-settings python \ --project=sample-project \ --repository=python-repo \ --location=europe-west9

Grégoire Borel 09.07.2024 19:27
Ответ принят как подходящий

Решение оказалось проще, чем ожидалось. У pip возникли проблемы с поиском посылки из-за неправильного использования флагов местоположения посылки, а именно --index-url и --extra-url. Я использовал первое, тогда как следовало бы использовать второе.

Мне нужно --extra-url указать на мой репозиторий реестра артефактов, чтобы найти мой пакет, и --index-url указать на PyPI по умолчанию, чтобы найти зависимости, необходимые моему пакету.

Короче говоря, вот что я только что добавил в свой Dockerfile:

RUN pip install keyrings.google-artifactregistry-auth
RUN pip install --extra-index-url https://europe-west9-python.pkg.dev/sample-project/python-repo/simple/ mypackage==0.3.0

Хороший! Спасибо, что поделились этим.

XQ Hu 11.07.2024 22:28

Другие вопросы по теме