Локальный 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/