diff --git a/.dockerignore b/.dockerignore old mode 100644 new mode 100755 index 4edbcb56..d8391b70 --- a/.dockerignore +++ b/.dockerignore @@ -1,11 +1,33 @@ build/ dist/ +karma-tests/ +sample_archive/ +tests/ +tests_disabled/ +venv/ +collections/ + .cache/ .eggs/ .git/ +.github/ +.venv +.travis +.pytest_cache + +.coveragerc +.dockerignore +.editorconfig +.gitattributes +.gitignore +.travis.yml +appveyor.yml +package.json +run-* +Vagrantfile +Dockerfile + **/*.egg **/*.egg-info **/__pycache__ **/*.pyc -collections/ - diff --git a/Dockerfile b/Dockerfile old mode 100644 new mode 100755 index e1122b3e..31729d6e --- a/Dockerfile +++ b/Dockerfile @@ -1,34 +1,34 @@ -ARG PYTHON=python:3.5.3 +ARG PYTHON=python:3.7.2 FROM $PYTHON -RUN mkdir /uwsgi -COPY uwsgi.ini /uwsgi/ - WORKDIR /pywb -ADD requirements.txt . -RUN pip install -r requirements.txt +COPY requirements.txt extra_requirements.txt ./ -ADD extra_requirements.txt . -RUN pip install -r extra_requirements.txt +RUN pip install --no-cache-dir -r requirements.txt -r extra_requirements.txt -ADD . . -RUN python setup.py install +COPY . ./ -RUN mkdir /webarchive -COPY config.yaml /webarchive/ - -VOLUME /webarchive +RUN python setup.py install \ + && mv ./docker-entrypoint.sh / \ + && mkdir /uwsgi && mv ./uwsgi.ini /uwsgi/ \ + && mkdir /webarchive && mv ./config.yaml /webarchive/ WORKDIR /webarchive +# auto init collection +ENV INIT_COLLECTION '' + +ENV VOLUME_DIR /webarchive + +#USER archivist +COPY docker-entrypoint.sh ./ + +# volume and port +VOLUME /webarchive EXPOSE 8080 +ENTRYPOINT ["/docker-entrypoint.sh"] CMD ["uwsgi", "/uwsgi/uwsgi.ini"] -RUN useradd -ms /bin/bash -u 1000 archivist - -USER archivist - - diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100755 index 00000000..d669b9ad --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +set -e + +# Get UID/GID from volume dir +VOLUME_UID=$(stat -c '%u' $VOLUME_DIR) +VOLUME_GID=$(stat -c '%g' $VOLUME_DIR) + +MY_UID=$(id -u) +MY_GID=$(id -g) + +# Run as custom user +if [ "$MY_GID" != "$VOLUME_GID" ] || [ "$MY_UID" != "$VOLUME_UID" ]; then + # create or modify user and group to match expected uid/gid + groupadd --gid $VOLUME_GID archivist || groupmod -o --gid $VOLUME_GID archivist + useradd -ms /bin/bash -u $VOLUME_UID -g $VOLUME_GID archivist || usermod -o -u $VOLUME_UID archivist + + # initialize a collection if defined and not present + if [ -n "$INIT_COLLECTION" ] && [ ! -d $VOLUME_DIR/collections/$INIT_COLLECTION ]; then + su archivist -c "wb-manager init $INIT_COLLECTION" + fi + + cmd="cd $PWD; $@" + + # run process as new archivist user + su archivist -c "$cmd" + +# run as current user (root) +else + # initialize a collection if defined and not present + if [ -n "$INIT_COLLECTION" ] && [ ! -d $VOLUME_DIR/collections/$INIT_COLLECTION ]; then + wb-manager init $INIT_COLLECTION + fi + + # run process directly + exec $@ +fi + diff --git a/requirements.txt b/requirements.txt index f6385fce..997de6bc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,7 +9,7 @@ brotlipy pyyaml werkzeug webencodings -gevent>=1.3[dnspython] +gevent webassets==0.12.1 portalocker wsgiprox>=1.5.1 diff --git a/setup.py b/setup.py index 8d769cc9..da4c8f62 100755 --- a/setup.py +++ b/setup.py @@ -10,7 +10,10 @@ import sys from pywb import __version__ -long_description = open('README.rst').read() +def get_ldecription(): + with open('README.rst', 'r') as fh: + long_description = fh.read() + return long_description class PyTest(TestCommand): @@ -58,7 +61,7 @@ def generate_git_hash_py(pkg, filename='git_hash.py'): def load_requirements(filename): with open(filename, 'rt') as fh: requirements = fh.read().rstrip().split('\n') - if (sys.version_info > (3, 0)): + if sys.version_info > (3, 0): requirements.append("py3AMF") else: requirements.append("pyAMF") @@ -87,7 +90,7 @@ setup( author='Ilya Kreymer', author_email='ikreymer@gmail.com', description='Pywb Webrecorder web archive replay and capture tools', - long_description=long_description, + long_description=get_ldecription(), license='GPL', packages=find_packages(exclude=['tests_disabled']), zip_safe=True,