我有一个托管在Google云平台伪影注册中的Python库。此外,我还有一个使用诗词的Python项目,它依赖于库。
这是我的项目文件pyproject.toml
[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并使用我的凭据进行了身份验证。因此,当我运行这个命令时,我看到了正确的结果,如下所示:
$ gcloud auth list
ACTIVE ACCOUNT
...
* <my-account>@appspot.gserviceaccount.com
...
此外,我将Python键环与keyrings.google-artifactregistry-auth结合使用,您可以在项目文件中看到这一点。
因此,通过这个设置,我可以运行poetry install
,依赖关系可以使用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
如您所见,我注入了谷歌凭据文件在此文档之后。这个很管用。我使用了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 <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 install
或poetry run...
命令,而且我看到了这一点,如果它有助于调试:
# gcloud auth list
Credentialed Accounts
ACTIVE ACCOUNT
* <my-account>@appspot.gserviceaccount.com
# keyring --list-backends
keyrings.gauth.GooglePythonAuth (priority: 9)
keyring.backends.chainer.ChainerBackend (priority: -1)
keyring.backends.fail.Keyring (priority: 0)
最后,我甚至尝试采用这种方法:在Docker容器中的无头Linux系统上使用密钥环,其结果与此相同:
# 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容器中解析我的依赖关系?
发布于 2022-10-20 18:47:38
您正在您的dockerfile命令中使用${GOOGLE_APPLICATION_CREDENTIALS}
,但是您没有使用ENV或ARG在Dockerfile中的任何地方定义它。
例如,在本节的Dockerfile中
RUN wget -q https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-${GCLOUD_VERSION}.tar.gz && \
您使用的是变量GCLOUD_VERSION
,您已经在这里的Dockerfile中定义了它
ARG GCLOUD_VERSION="401.0.0-linux-x86_64"
因此,当您在这一行中使用变量时:
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 。
我希望这能帮到你!
发布于 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
[tool.poetry.group.seed.dependencies]
keyrings.google-artifactregistry-auth = "^1.1.1"
然后在Dockerfile
中使用以下内容替换当前的身份验证和安装部分:
# 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
https://stackoverflow.com/questions/74106823
复制相似问题