Локальный pypi сервер сообщает мне 403 Запрещено при регистрации пакетов

Я пытаюсь развернуть 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), а затем выполнил команду, определенную выше, это работает! Я могу зарегистрировать пакеты против этого.

Pypi работает за пределами Dockerfile:

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, то пытаюсь зарегистрироваться внутри него, он НЕ работает:

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, что требует специальной настройки для нахождения внутри контейнера докера? Кто-нибудь пробовал это сами?

ОБНОВИТЬ

Похоже, что док-контейнер прослушивает порт 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  

1 ответ

Решение

Expose не предоставляет порты хост-машине. Для этого вам нужно использовать -p или же -P или создайте файл docker-compose.yml с ports определения.

См. https://docs.docker.com/engine/reference/builder/ и https://docs.docker.com/compose/compose-file/

Другие вопросы по тегам