本地 pypi 服务器在注册包时告诉我 403 Forbidden

Posted

技术标签:

【中文标题】本地 pypi 服务器在注册包时告诉我 403 Forbidden【英文标题】:Local pypi server tells me 403 Forbidden when registering packages 【发布时间】:2017-08-08 12:18:21 【问题描述】:

我正在尝试部署一个 pypi-server 来托管我们的内部包。我一直在为这个 docker 容器中 pypi 的行为而烦恼。

Dockerfile

FROM python:3.5

RUN apt-get update
RUN pip install --upgrade pip
RUN pip install -U passlib pypiserver[cache]==1.2.0
RUN mkdir -p /src/pypi/packages

EXPOSE 8080
ADD ./htpasswd /src/pypi/htpasswd

CMD ["pypi-server", "-p 8080", "-P", "/src/pypi/htpasswd","/src/pypi/packages"]

很简单,对吧? dockerfile 的姐妹当然有一个名为 htpasswd 的文件,其中包含一个用户名/密码对。

如果我在本地完成了 docker 文件中定义的步骤(在我的 docker 外部环境中),然后执行上面定义的命令,它就可以工作了!我可以针对它注册包。

在 Dockerfile 之外运行的 Pypi:

python setup.py register -r local
running register
running egg_info
writing top-level names to ah_model.egg-info/top_level.txt
writing dependency_links to ah_model.egg-info/dependency_links.txt
writing ah_model.egg-info/PKG-INFO
file foobar_utils.py (for module foobar_utils) not found
reading manifest file 'ah_model.egg-info/SOURCES.txt'
writing manifest file 'ah_model.egg-info/SOURCES.txt'
running check
Registering ah_model to http://localhost:8081
Server response (200): OK

但是,如果我构建并运行 dockerfile,然后尝试在其中注册,它不起作用:

在 docker 中运行的 Pypi:

python setup.py register -r local
running register
running egg_info
writing top-level names to ah_model.egg-info/top_level.txt
writing ah_model.egg-info/PKG-INFO
writing dependency_links to ah_model.egg-info/dependency_links.txt
file foobar_utils.py (for module foobar_utils) not found
reading manifest file 'ah_model.egg-info/SOURCES.txt'
writing manifest file 'ah_model.egg-info/SOURCES.txt'
running check
Registering ah_model to http://localhost:8080
Server response (403): Forbidden

pypi 的工作方式是否需要特殊调整才能进入 docker 容器?有人自己试过吗?

更新

看起来 docker 容器正在监听 8080 端口:

root@a0ec19c89a9d:/src/pypi# netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      1/python3.5  

【问题讨论】:

看起来您正在尝试在构建时未运行的容器内的 8080 端口使用服务。 您是说 docker 容器由于我的配置方式而没有在 8080 上侦听吗?如果是这样,请参阅上面的更新。该容器似乎正在侦听 8080。当我将网络浏览器指向它时,我会看到 pypi 的正常启动页面(欢迎使用 pypiserver)。 【参考方案1】:

Expose 不会将端口公开给主机。为此,您需要使用 -p-P 或使用 ports 定义创建 docker-compose.yml 文件。

见https://docs.docker.com/engine/reference/builder/#expose和https://docs.docker.com/compose/compose-file/#ports

【讨论】:

当我工作太晚时会发生这种情况。谢谢。

以上是关于本地 pypi 服务器在注册包时告诉我 403 Forbidden的主要内容,如果未能解决你的问题,请参考以下文章

如何为 pypi pip 搜索设置 devpi-server

为 devpi 配置服务器列表

查看友好 URL 时 Webforms 403.14 错误 IIS 7

从 PyPI 安装我的 sdist 会将文件放在意想不到的地方

pip 安装包时指定pypi资源地址

在制作 Laravel 包时,如何注册依赖包的服务提供者和别名?