FROM python:3.8-alpine3.12 as base # Copy the requirements & code and install them # Do this in a separate image in a separate directory # to not have all the build stuff in the final image FROM base AS builder_gosu ENV GOSU_VERSION 1.12 RUN apk add --no-cache --virtual .build-deps \ ca-certificates \ dpkg \ gnupg \ && dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" \ && wget -O /usr/local/bin/gosu https://github.com/tianon/gosu/releases/download/${GOSU_VERSION}/gosu-${dpkgArch} \ && wget -O /usr/local/bin/gosu.asc https://github.com/tianon/gosu/releases/download/${GOSU_VERSION}/gosu-${dpkgArch}.asc \ # verify the signature && export GNUPGHOME="$(mktemp -d)" \ && gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \ && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \ && command -v gpgconf && gpgconf --kill all || true \ && rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc \ && chmod +x /usr/local/bin/gosu \ # check installation && gosu --version \ && gosu nobody true \ && apk del --no-cache \ .build-deps \ && rm -rf /var/cache/apk/* \ && rm -rf /tmp/* FROM base AS builder_dependencies WORKDIR /code COPY docker/docker-requirements.txt . # Install requirements RUN apk add --no-cache --virtual .build-deps \ build-base \ libffi-dev \ && mkdir /install \ && python -m pip install \ --no-warn-script-location \ --prefix=/install \ --requirement docker-requirements.txt # Install pypiserver # - do this separately from deps so that when developing, every change does not # require reinstalling deps COPY pypiserver pypiserver COPY setup.cfg . COPY setup.py . COPY README.md . RUN python -m pip install --no-warn-script-location --prefix=/install . FROM base WORKDIR /data # Copy the libraries installed via pip COPY --from=builder_dependencies /install /usr/local COPY --from=builder_gosu /usr/local/bin/gosu /usr/local/bin/gosu COPY docker/entrypoint.sh /entrypoint.sh COPY docker/gunicorn.conf.py /data # Use a consistent user and group ID so that linux users # can create a corresponding system user and set permissions # if desired. RUN apk add bash \ && rm -rf /var/cache/apk/* \ && rm -rf /tmp/* \ && addgroup -S -g 9898 pypiserver \ && adduser -S -u 9898 -G pypiserver pypiserver --home /data\ && mkdir -p /data/packages \ && chmod +x /entrypoint.sh VOLUME /data/packages ENV PYPISERVER_PORT=8080 # PORT is deprecated. Please use PYPISERVER_PORT instead ENV PORT=$PYPISERVER_PORT # Flush logs immediately to stdout ENV PYTHONUNBUFFERED=t EXPOSE $PYPISERVER_PORT ENTRYPOINT ["/entrypoint.sh"]