[docker] How to create private python repository with docker compose Develop Tip

파이썬은 pypi로 패키지 저장소를 관리합니다.
Python programming language use pypi package repository as a module package repository.

pip를 이용해서 패키지를 설치하고 하는 등의 관리를 담당하지요.
이러한 pypi 패키지를 사설로 관리를 할 수 있는데, 바로 pypiserver 를 통해서 가능합니다.

Using pip you can install or manage third party python modues.
Instead of official python package repository you can create your own private python package repository.
요즘에는 이런 서버를 VM이나 물리적 서버에서 직접

pip install pypiserver
라고 설치하여 이용할 수도 있겠지만,
이를 사설로 관리할 수 있는 것을 다커 허브에서 찾아보았습니다.

위에 사이트에서 공식 이미지를 사용해도 되지만, 가벼운 것으로 찾아보았더니,

codekoala/docker-pypi 분이 작업한 것이 있었습니다.

우선 위에 분이 작성한 Dockerfile을 확인해 보면,

FROM alpine:3.7
MAINTAINER Josh VanderLinden <codekoala@gmail.com>

RUN apk update && \
    apk add py-pip && \
    pip install --upgrade pip && \
    mkdir -p /srv/pypi

RUN pip install -U passlib pypiserver[cache]==1.2.1

EXPOSE 80
VOLUME ["/srv/pypi"]

ADD entrypoint.sh /
CMD ["/entrypoint.sh"]

무척 씸플합니다.

만약 upload를 하려면 
htpasswd -s /path/pypi/.htpasswd yourusername
와 같이 로그인 파일을 만들어,

docker-compose.yaml 을 다음과 같이 작성해서,

version: '2'
services:
  ##############################################################################
  # Private PYPI Server
  ##############################################################################
  pypi_server:
    image: codekoala/pypi
    container_name: pp_pypi
    hostname: pp_pypi.local
    environment:
      - PYPI_OVERWRITE=true
    volumes:
      - "/path/pypi:/pypi:rw"
    expose:
      - 80/tcp
    ports:
      - "8080:80"

돌리면 잘 돕니다.

문제는 잘 돌다가, 웹브라우저 등으로 동시에 여러 곳에서 동시에 다운로드 등을 하면,
잘 돌던 서비스가 멈춘다는 것이었습니다.

두 시간 여를 살펴보다 정확한 원인은 모르겠지만, 파이썬 bottle 프레임워크에서 멈추는 것이 아닌가 싶었습니다.
결국 pypiserver 가 gunicorn, twisted 등등의 WSGI 솔루션을 지원하는 것을 알았고,
몇 가지의 시행착오를 거친 후 twisted를 붙여 동작시키니 잘 해결되는 것을 알아 공유하고자 합니다.

해당 소스는 여기를 참고하셔요.

Dockerfile 은,

FROM ubuntu:16.04
MAINTAINER Jerry Chae <mcchae@gmail.com>

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update \
&& apt-get install -y python3 python3-dev python3-pip \
    && mkdir -p /pypi

RUN pip3 install -U pip
RUN pip3 install -U passlib pypiserver twisted

EXPOSE 80
VOLUME ["/pypi"]

ADD entrypoint.sh /
CMD ["/entrypoint.sh"]

위와 같이 우분투를 base로 하여 pypiserver 및 twisted 를 설치했고,

시작 쉘인 entrypoint.sh 에서

exec /usr/local/bin/pypi-server \
    --port ${PYPI_PORT} \
    --passwords "${PYPI_PASSWD_FILE}" \
    --authenticate "${PYPI_AUTHENTICATE}" \
    ${_extra} \
    --server twisted \
    "${PYPI_ROOT}"

위와 같이  --server twisted 를 지정했습니다.


어느 분께는 도움이 되셨기를 ..

핑백

덧글

댓글 입력 영역

구글애드텍스트