У меня есть пакет 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, но я бы хотел этого избежать. Могу ли я использовать функцию выдачи себя за учетную запись службы?






Пожалуйста, проверьте этот пример: https://github.com/GoogleCloudPlatform/python-docs-samples/blob/main/dataflow/flex-templates/pipeline_with_dependentities/Dockerfile
Вам необходимо убедиться, что mypackage находится в вашем контейнере.
Я не уверен, что понимаю связь с этим решением и моей проблемой. Как вы сказали, мне нужно убедиться, что моя посылка находится в контейнере, прежде чем бежать pip install .. Но в этом и вся проблема, у меня проблемы с доступом к реестру артефактов, поэтому я не могу его установить. Если только вы не предлагаете установить пакет вручную (скопировав его из моей папки sites-packages). В этом случае я не считаю это решение очень чистым.
COPY my_package my_package вы можете просто сделать это.
Я не понимаю. Откуда берется my_package? Пакет, который я использую, установлен с помощью pip install и взят из реестра артефактов. Он не находится в моем локальном репозитории, поэтому я не могу его просто скопировать.
Я понимаю. pip install --no-cache-dir -U --index-url=https://europe-west9-python.pkg.dev/sample-project/python-repo/ mypackage : это работает локально?
Да, это так. Чтобы это работало локально, мне пришлось сделать pip install keyrings.google-artifactregistry-auth. Мне также пришлось добавить конфигурацию репозитория реестра артефактов в мой проект Python, следуя инструкциям этой команды: gcloud artifacts print-settings python \ --project=sample-project \ --repository=python-repo \ --location=europe-west9
Решение оказалось проще, чем ожидалось. У 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
Хороший! Спасибо, что поделились этим.
Я думаю, это интересный вопрос. К сожалению, я не использовал реестр артефактов ни для чего, кроме образов контейнеров. Я думаю, вы хотите, чтобы ваш файл-контейнер был портативным, чтобы вы могли использовать Cloud Build и где угодно. По этой причине, я думаю (!?) лучшим решением будет смонтировать ключ и экспортировать
GOOGLE_APPLICATION_CREDENTIALS. Тем не менее, вы не можете использовать, например, Создайте учетные данные Cloud Build и превратите их в учетные данные для монтирования. Итак, я думаю, вам захочется использовать Secret Manager, чтобы сохранить отдельный ключ и смонтировать его.