|
@@ -0,0 +1,162 @@
|
|
|
+FROM nvidia/cuda:11.7.0-cudnn8-runtime-ubuntu20.04
|
|
|
+
|
|
|
+# ensure local python is preferred over distribution python
|
|
|
+ENV PATH /usr/local/bin:$PATH
|
|
|
+
|
|
|
+# http://bugs.python.org/issue19846
|
|
|
+# > At the moment, setting "LANG=C" on a Linux system *fundamentally breaks Python 3*, and that's not OK.
|
|
|
+ENV LANG C.UTF-8
|
|
|
+
|
|
|
+RUN apt-get update
|
|
|
+
|
|
|
+# runtime dependencies
|
|
|
+RUN set -eux; \
|
|
|
+ apt-get install -y \
|
|
|
+ ca-certificates \
|
|
|
+ tzdata \
|
|
|
+ ;
|
|
|
+
|
|
|
+ENV GPG_KEY A035C8C19219BA821ECEA86B64E628F8D684696D
|
|
|
+ENV PYTHON_VERSION 3.10.10
|
|
|
+
|
|
|
+RUN apt-get update && \
|
|
|
+ set -eux; \
|
|
|
+ \
|
|
|
+ apt-get install -y \
|
|
|
+ build-essential\
|
|
|
+ wget \
|
|
|
+ curl \
|
|
|
+ tar \
|
|
|
+ xz-utils\
|
|
|
+ make \
|
|
|
+ cmake \
|
|
|
+ zlib1g-dev \
|
|
|
+ libssl-dev \
|
|
|
+ libssl1.1 || sudo apt install libssl1.0 \
|
|
|
+ software-properties-common \
|
|
|
+ libgl1-mesa-glx libsm6 libxrender1 libxext-dev\
|
|
|
+ ; \
|
|
|
+ \
|
|
|
+ wget -O python.tar.xz "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz"; \
|
|
|
+ wget -O python.tar.xz.asc "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc"; \
|
|
|
+ GNUPGHOME="$(mktemp -d)"; export GNUPGHOME; \
|
|
|
+ gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$GPG_KEY"; \
|
|
|
+ gpg --batch --verify python.tar.xz.asc python.tar.xz; \
|
|
|
+ command -v gpgconf > /dev/null && gpgconf --kill all || :; \
|
|
|
+ rm -rf "$GNUPGHOME" python.tar.xz.asc; \
|
|
|
+ mkdir -p /usr/src/python; \
|
|
|
+ tar --extract --directory /usr/src/python --strip-components=1 --file python.tar.xz; \
|
|
|
+ rm python.tar.xz; \
|
|
|
+ \
|
|
|
+ cd /usr/src/python; \
|
|
|
+ # gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; \
|
|
|
+ ./configure \
|
|
|
+ #--build="$gnuArch" \
|
|
|
+ --enable-loadable-sqlite-extensions \
|
|
|
+ --enable-optimizations \
|
|
|
+ --enable-option-checking=fatal \
|
|
|
+ --enable-shared \
|
|
|
+ --with-lto \
|
|
|
+ --with-system-expat \
|
|
|
+ --without-ensurepip \
|
|
|
+ ; \
|
|
|
+ nproc="$(nproc)"; \
|
|
|
+# set thread stack size to 1MB so we don't segfault before we hit sys.getrecursionlimit()
|
|
|
+# https://github.com/alpinelinux/aports/commit/2026e1259422d4e0cf92391ca2d3844356c649d0
|
|
|
+ EXTRA_CFLAGS="-DTHREAD_STACK_SIZE=0x100000"; \
|
|
|
+ LDFLAGS="-Wl,--strip-all"; \
|
|
|
+ make -j "$nproc" \
|
|
|
+ "EXTRA_CFLAGS=${EXTRA_CFLAGS:-}" \
|
|
|
+ "LDFLAGS=${LDFLAGS:-}" \
|
|
|
+ "PROFILE_TASK=${PROFILE_TASK:-}" \
|
|
|
+ ; \
|
|
|
+# https://github.com/docker-library/python/issues/784
|
|
|
+# prevent accidental usage of a system installed libpython of the same version
|
|
|
+ rm python; \
|
|
|
+ make -j "$nproc" \
|
|
|
+ "EXTRA_CFLAGS=${EXTRA_CFLAGS:-}" \
|
|
|
+ "LDFLAGS=${LDFLAGS:--Wl},-rpath='\$\$ORIGIN/../lib'" \
|
|
|
+ "PROFILE_TASK=${PROFILE_TASK:-}" \
|
|
|
+ python \
|
|
|
+ ; \
|
|
|
+ make install; \
|
|
|
+ \
|
|
|
+ cd /; \
|
|
|
+ rm -rf /usr/src/python; \
|
|
|
+ \
|
|
|
+ find /usr/local -depth \
|
|
|
+ \( \
|
|
|
+ \( -type d -a \( -name test -o -name tests -o -name idle_test \) \) \
|
|
|
+ -o \( -type f -a \( -name '*.pyc' -o -name '*.pyo' -o -name 'libpython*.a' \) \) \
|
|
|
+ \) -exec rm -rf '{}' + \
|
|
|
+ ; \
|
|
|
+ \
|
|
|
+ find /usr/local -type f -executable -not \( -name '*tkinter*' \) -exec scanelf --needed --nobanner --format '%n#p' '{}' ';' \
|
|
|
+ | tr ',' '\n' \
|
|
|
+ | sort -u \
|
|
|
+ | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
|
|
|
+ | xargs -rt apk add --no-network --virtual .python-rundeps \
|
|
|
+ ; \
|
|
|
+ # apk del --no-network .build-deps; \
|
|
|
+ \
|
|
|
+ python3 --version
|
|
|
+
|
|
|
+# make some useful symlinks that are expected to exist ("/usr/local/bin/python" and friends)
|
|
|
+RUN set -eux; \
|
|
|
+ for src in idle3 pydoc3 python3 python3-config; do \
|
|
|
+ dst="$(echo "$src" | tr -d 3)"; \
|
|
|
+ [ -s "/usr/local/bin/$src" ]; \
|
|
|
+ [ ! -e "/usr/local/bin/$dst" ]; \
|
|
|
+ ln -svT "$src" "/usr/local/bin/$dst"; \
|
|
|
+ done
|
|
|
+
|
|
|
+# if this is called "PIP_VERSION", pip explodes with "ValueError: invalid truth value '<VERSION>'"
|
|
|
+ENV PYTHON_PIP_VERSION 22.3.1
|
|
|
+# https://github.com/docker-library/python/issues/365
|
|
|
+ENV PYTHON_SETUPTOOLS_VERSION 65.5.1
|
|
|
+# https://github.com/pypa/get-pip
|
|
|
+ENV PYTHON_GET_PIP_URL https://github.com/pypa/get-pip/raw/1a96dc5acd0303c4700e02655aefd3bc68c78958/public/get-pip.py
|
|
|
+ENV PYTHON_GET_PIP_SHA256 d1d09b0f9e745610657a528689ba3ea44a73bd19c60f4c954271b790c71c2653
|
|
|
+
|
|
|
+RUN curl -O https://bootstrap.pypa.io/get-pip.py && \
|
|
|
+ python get-pip.py && \
|
|
|
+ rm get-pip.py \
|
|
|
+ \
|
|
|
+ pip --version
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+RUN sed -i 's/^#force_color_prompt=yes/force_color_prompt=yes/' ~/.bashrc && \
|
|
|
+ # above enable color prompt of docker in terminal
|
|
|
+ # set alias
|
|
|
+ echo "alias nv='nvidia-smi'" >> ~/.bash_aliases && \
|
|
|
+ echo "alias wnv='watch -n 1 nvidia-smi'" >> ~/.bash_aliases && \
|
|
|
+ echo "alias wwnv='watch -n 0.1 nvidia-smi'" >> ~/.bash_aliases
|
|
|
+
|
|
|
+RUN python3 --version
|
|
|
+
|
|
|
+WORKDIR /app/
|
|
|
+
|
|
|
+RUN curl -sSL https://install.python-poetry.org | POETRY_HOME=/opt/poetry python3 && \
|
|
|
+ cd /usr/local/bin && \
|
|
|
+ ln -s /opt/poetry/bin/poetry && \
|
|
|
+ poetry config virtualenvs.create false
|
|
|
+
|
|
|
+COPY ./app/gpuproject.toml /app/pyproject.toml
|
|
|
+
|
|
|
+ARG INSTALL_DEV=false
|
|
|
+RUN bash -c "if [ $INSTALL_DEV == 'true' ] ; then poetry install --no-root ; else poetry install --no-root --no-dev ; fi"
|
|
|
+
|
|
|
+ENV C_FORCE_ROOT=1
|
|
|
+
|
|
|
+COPY ./app /app
|
|
|
+WORKDIR /app
|
|
|
+COPY /${CELERY_ZIP_STORAGE} /app/${CELERY_ZIP_STORAGE}
|
|
|
+COPY /${CELERY_ZIP_STORAGE} /app/${CELERY_ZIP_STORAGE}
|
|
|
+
|
|
|
+
|
|
|
+COPY ./app/worker-start.sh /worker-start.sh
|
|
|
+
|
|
|
+RUN chmod +x /worker-start.sh
|
|
|
+
|
|
|
+CMD ["bash", "/worker-start.sh"]
|