首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >码头内私人依附的工作诗歌项目

码头内私人依附的工作诗歌项目
EN

Stack Overflow用户
提问于 2022-10-18 06:52:44
回答 2查看 457关注 0票数 8

我有一个托管在Google云平台伪影注册中的Python库。此外,我还有一个使用诗词的Python项目,它依赖于库。

这是我的项目文件pyproject.toml

代码语言:javascript
运行
复制
[tool.poetry]
name = "Test"
version = "0.0.1"
description = "Test project."
authors = [
    "Me <me@mycompany.com>"
]

[tool.poetry.dependencies]
python = ">=3.8,<4.0"
mylib = "0.1.1"

[tool.poetry.dev-dependencies]
"keyrings.google-artifactregistry-auth" = "^1.1.0"
keyring = "^23.9.0"

[build-system]
requires = ["poetry-core>=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 CLI并使用我的凭据进行了身份验证。因此,当我运行这个命令时,我看到了正确的结果,如下所示:

代码语言:javascript
运行
复制
$ gcloud auth list
ACTIVE  ACCOUNT
...
*       <my-account>@appspot.gserviceaccount.com
...

此外,我将Python键环keyrings.google-artifactregistry-auth结合使用,您可以在项目文件中看到这一点。

因此,通过这个设置,我可以运行poetry install,依赖关系可以使用GCP的身份验证从我的私有工件注册中心下载。

当我试图在Docker容器中应用相同的原则时,就会出现这个问题。

我创建了这样一个Docker文件:

代码语言:javascript
运行
复制
# 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

如您所见,我注入了谷歌凭据文件在此文档之后。这个很管用。我使用了Docker BuildKit机密,因为暴露了这里 (安全问题不是这个问题的问题)。因此,当我试图构建映像时,我得到了一个身份验证错误(GOOGLE_APPLICATION_CREDENTIALS被正确地设置为一个有效的密钥文件):

代码语言:javascript
运行
复制
$ DOCKER_BUILDKIT=1 docker image build --secret id=GOOGLE_APPLICATION_CREDENTIALS,src=${GOOGLE_APPLICATION_CREDENTIALS} -t app-test .

...
#19 66.68 <c1>Source (my-lib):</c1> 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中的所有命令,在Docker之外使用相同的Google凭据密钥文件,那么它就可以工作了。

我甚至尝试在映像中进行调试,而不是执行poetry installpoetry run...命令,而且我看到了这一点,如果它有助于调试:

代码语言:javascript
运行
复制
# gcloud auth list
                  Credentialed Accounts
ACTIVE  ACCOUNT
*       <my-account>@appspot.gserviceaccount.com
代码语言:javascript
运行
复制
# keyring --list-backends
keyrings.gauth.GooglePythonAuth (priority: 9)
keyring.backends.chainer.ChainerBackend (priority: -1)
keyring.backends.fail.Keyring (priority: 0)

最后,我甚至尝试采用这种方法:在Docker容器中的无头Linux系统上使用密钥环,其结果与此相同:

代码语言:javascript
运行
复制
# 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│
...

我甚至试着听从另一个问题的建议。没有成功。

gcloud CLI在容器内部工作,测试其他命令。我的猜测是,与Keyring的集成不能正常工作,但我不知道如何调试它。

如何在Docker容器中解析我的依赖关系?

EN

回答 2

Stack Overflow用户

发布于 2022-10-20 18:47:38

您正在您的dockerfile命令中使用${GOOGLE_APPLICATION_CREDENTIALS},但是您没有使用ENV或ARG在Dockerfile中的任何地方定义它。

例如,在本节的Dockerfile中

代码语言:javascript
运行
复制
RUN wget -q https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-${GCLOUD_VERSION}.tar.gz && \

您使用的是变量GCLOUD_VERSION,您已经在这里的Dockerfile中定义了它

代码语言:javascript
运行
复制
ARG GCLOUD_VERSION="401.0.0-linux-x86_64"

因此,当您在这一行中使用变量时:

代码语言:javascript
运行
复制
RUN --mount=type=secret,id=GOOGLE_APPLICATION_CREDENTIALS ${GOOGLE_APPLICATION_CREDENTIALS} gcloud auth activate-service-account --key-file=/run/secrets/GOOGLE_APPLICATION_CREDENTIALS

您需要在Dockerfile中将其定义为ENV

我希望这能帮到你!

票数 0
EN

Stack Overflow用户

发布于 2022-10-25 14:43:11

我认为这里的问题是poetry无法从密钥环获得凭据,因为它没有安装keyrings.google-artifactregistry-auth,而且它无法安装keyrings.google-artifactregistry-auth,因为它无法安装私有包。要解决这个问题,您需要引导或预装keyrings.google-artifactregistry-auth患有类似的问题,但有一个有记录的方法来处理它。

poetry的文档在配置凭据部分下的第二个信息框中为Azure指出了类似的问题。然而,Azure解决了引导问题,它有一个包,它预先种子新的虚拟环境与必要的包进行身份验证。我找不到GCE的等价物,所以这不是一个选择,除非你自己开发一个。

或者,由于您在项目中包含了一个锁文件,所以您可以尝试利用依赖组选项来获得诗歌,在安装其他所有内容之前安装虚拟环境和安装keyrings.google-artifactregistry-auth。我没有尝试过,因为我没有GCE或Azure帐户,但我想我会在可能的情况下分享它:

将以下部分添加到pyproject.toml

代码语言:javascript
运行
复制
[tool.poetry.group.seed.dependencies]
keyrings.google-artifactregistry-auth = "^1.1.1"

然后在Dockerfile中使用以下内容替换当前的身份验证和安装部分:

代码语言:javascript
运行
复制
# copy Poetry project files and install dependencies
WORKDIR /app
COPY ./.env* ./
COPY ./pyproject.toml ./poetry.lock* ./

# install Google Artifact Registry keyring integration
RUN poetry install --only seed
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 poetry run keyring --list-backends

RUN poetry install
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74106823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档