簡體   English   中英

詩歌安裝私有 package 開始在 Docker 中突然失敗

[英]Poetry install private package started suddenly failing in Docker

關於

最小工作示例: https://gitlab.com/hynek.blaha/debug-docker-poetry/-/tree/master

我一直在使用 Poetry 和來自內部 PyPI 注冊表的 Python 包構建 Docker 圖像。 由於我們的項目位於私有 GitLab 存儲庫中,並且內部包不是絕密的,因此我們將詩歌憑證直接存儲在 pyproject.toml 的詩歌源pyproject.toml中。

2022-08-24 ,我們所有的 Docker 構建在安裝內部 package 時開始失敗:

• Installing til-bigquery (0.3.4)

  HTTPError

  401 Client Error: Unauthorized for url: https://gitlab.com/api/v4/projects/38869805/packages/pypi/files/7a4731d831d4b37262481002271e359f96017570e9480ef16c89489e0b41252f/til_bigquery-0.3.4-py3-none-any.whl#sha256=7a4731d831d4b37262481002271e359f96017570e9480ef16c89489e0b41252f

  at /usr/local/lib/python3.9/site-packages/requests/models.py:1021 in raise_for_status
      1017│                 f"{self.status_code} Server Error: {reason} for url: {self.url}"
      1018│             )
      1019│ 
      1020│         if http_error_msg:
    → 1021│             raise HTTPError(http_error_msg, response=self)
      1022│ 
      1023│     def close(self):
      1024│         
      1025│         called the underlying ``raw`` object must not be accessed again.

我發現很奇怪:

  • Docker 構建失敗,即使我重試部署作業,幾天前成功通過。
  • 考慮到問題可能是由 Docker 基本映像python:3.7-slim或 Poetry 的未固定次要版本引起的,我使用了舊版本但得到了相同的結果。
  • 我比較了先前成功構建build_success.log ( 8/22/22, 3:00 PM ) 和相同構建重試build_fail.log ( 8/24/22, 6:00 AM ) 的構建日志,發現兩者使用相同詩歌輪poetry-1.1.15-py2.py3-none-any.whl

它在我的機器上仍然像以前一樣工作,但在 Docker 中失敗。

  • 當我從存儲庫 URL 中刪除憑據時,它會停止在 localhost 上工作,因此我確信憑據不會存儲在其他任何地方(例如 ~/.netrc)。

如何重現:

  1. 本地主機 - 好的
git clone git@gitlab.com:hynek.blaha/debug-docker-poetry.git
poetry install
  1. Docker - 失敗
git clone git@gitlab.com:hynek.blaha/debug-docker-poetry.git
docker build .

我可以通過在 Dockerfile 中明確提供憑據來解決此問題:

RUN pip install poetry --no-cache-dir && \
    poetry config virtualenvs.create false && \
    poetry config repositories.my_private_repo https://gitlab.com/api/v4/projects/21870843/packages/pypi/simple && \
    poetry config http-basic.my_private_repo __token__ glpat-mkEPJ4Rsy2peTCrH23pG

但它沒有解釋為什么重建相同的圖像開始失敗。 以及為什么它在我的機器上(在 Docker 之外)上運行時仍能按預期工作。

有誰知道,可能會發生什么變化? 即使在build_success.logbuild_fail.log上使用diff ,我也無法分辨出什么

在過去的幾天里,我一直在努力解決同樣的問題。 雖然我仍然不確定確切的原因,但我設法避免了這個問題。

直到昨天,我還使用了一個存儲庫 URL 和嵌入在pyproject.toml中的憑據,就像這樣。

[[tool.poetry.source]]
name = 'private'
url = 'https://gitlabce.example.com/api/v4/projects/<project_id>/packages/pypi/simple'
secondary = true

雖然它與您的解決方案基本相同,但您可以通過在項目根目錄創建poetry.toml來為每個項目指定本地詩歌配置。 因此,無需在 URL 中嵌入憑證,您可以通過以下方式指定它們: poetry.toml

[http-basic]
[http-basic.private]
username = "your_username"
password = "your_password"

這樣,您可以使用嵌入式憑據重現相同的行為,而不會出現身份驗證錯誤。

為什么它在 docker 之外仍然有效?

我猜這是由於您本地環境中的存檔緩存。 由於詩歌將下載的檔案存儲在~/.cache/pypoetry/artifacts/並在執行poetry install時重用它們,因此您首先不需要訪問您的私有 PyPI 服務器。 如果您手動刪除檔案(我不確定,但poetry cache clear命令不適用於我的情況),即使在本地環境中,您也可以重現身份驗證錯誤。

為什么錯誤突然開始出現?

Poetry 使用嵌入式憑據來查詢指向私有 PyPI 服務器的 package 鏈接列表。 它可以正常工作,但是,在安裝實際包時,Poetry 使用從 PyPI 服務器獲取的鏈接,該鏈接沒有嵌入任何憑據。 這就是它失敗並且錯誤消息中顯示的 URL 沒有嵌入任何憑據的原因。

我仍然不確定為什么直到幾天前憑證嵌入才起作用。 我想 GitLab 方面可能有行為變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM