事象
以下のイメージを使って開発したPythonパッケージをホスティングしています。
ある日、Poetryのインストールが以下のようなエラーとなる事象が発生しました。
Retrieved digest for link my_package_name-1.0.0-py3-none-any.whl(md5:xxxxxxx) not in poetry.lock metadata ['sha256:xxxxx', 'sha256:xxxxx']
at /usr/local/lib/python3.8/site-packages/poetry/installation/chooser.py:144 in _get_links
140│
141│ selected_links.append(link)
142│
143│ if links and not selected_links:
→ 144│ raise RuntimeError(
145│ f"Retrieved digest for link {link.filename}({h}) not in poetry.lock"
146│ f" metadata {hashes}"
147│ )
148│
調査
メッセージを読むと分かるのですが、 md5:xxxxxxx
のハッシュと、 sha256:xxxxx
のハッシュを比べているので、それはエラーになるなというところです。
このハッシュですが、PyPiサーバの以下のようなURLから取得されています。これが間違っていそうです。
https://pypiserver.local/packages/my-package-name-1.0.0.tar.gz#md5=xxxxx
対応
コンテナを起動するコマンドに --hash-algo sha256
とオプションを付けることで、
docker run pypiserver/pypiserver:v1.5.1 --hash-algo sha256
sha256のURLが生成されるようになります。
https://pypiserver.local/packages/my-package-name-1.0.0.tar.gz#sha256=yyy
後はPoetry側のpoetry.lockを削除してpoetry installするか、poetry lockコマンドで解消します。
もう少し細かい原因
この事象ですが、poetryの1.1系では発生せずに、1.2系で発生する事象です。
ざっとコードとコミットを読んだ感じだと以下のコミットで動作が変わったと思っています。
同じ事象に当たった人の参考になれば幸いです。