From 93906f40dd70755c13ff9fbe98e524639d41c062 Mon Sep 17 00:00:00 2001 From: Colin Swaney Date: Tue, 17 Sep 2024 16:16:14 -0400 Subject: [PATCH 1/7] Create Dockerfiles --- deploy/dev/Dockerfile | 68 ++++++++++++++++++++++++++++++++++++++++ deploy/prod/Dockerfile | 70 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 deploy/dev/Dockerfile create mode 100644 deploy/prod/Dockerfile diff --git a/deploy/dev/Dockerfile b/deploy/dev/Dockerfile new file mode 100644 index 0000000..c45bd18 --- /dev/null +++ b/deploy/dev/Dockerfile @@ -0,0 +1,68 @@ +ARG PYTHON_BUILDER_IMAGE=3.11-slim-bookworm + +FROM python:${PYTHON_BUILDER_IMAGE} AS python-base +ENV PIP_DEFAULT_TIMEOUT=100 \ + PIP_DISABLE_PIP_VERSION_CHECK=1 \ + PIP_NO_CACHE_DIR=1 \ + PIP_ROOT_USER_ACTION=ignore \ + PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 \ + PYTHONFAULTHANDLER=1 \ + PYTHONHASHSEED=random \ + LANG=C.UTF-8 \ + LC_ALL=C.UTF-8 +RUN apt-get update \ + && apt-get upgrade -y \ + && apt-get install -y --no-install-recommends git tini \ + && apt-get autoremove -y \ + && apt-get clean -y \ + && rm -rf /root/.cache \ + && rm -rf /var/apt/lists/* \ + && rm -rf /var/cache/apt/* \ + && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false\ + && mkdir -p /workspace/app \ + && pip install --quiet -U pip wheel setuptools virtualenv + +FROM python-base AS build-base +ENV PATH="/workspace/app/.venv/bin:/usr/local/bin:$PATH" +RUN apt-get install -y --no-install-recommends build-essential curl \ + && apt-get autoremove -y \ + && apt-get clean -y \ + && rm -rf /root/.cache \ + && rm -rf /var/apt/lists/* \ + && rm -rf /var/cache/apt/* \ + && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false + +WORKDIR /workspace/app +COPY pyproject.toml README.md .pre-commit-config.yaml LICENSE ./ +# COPY scripts ./scripts/ +# COPY public ./public/ +# COPY resources ./resources/ +RUN python -m venv /workspace/app/.venv + +FROM build-base AS prod-image +ARG ENV_SECRETS="runtime-secrets" +ENV PATH="/workspace/app/.venv/bin:$PATH" \ + VIRTUAL_ENV="/workspace/app/.venv" \ + ENV_SECRETS="${ENV_SECRETS}" \ + PIP_DEFAULT_TIMEOUT=100 \ + PIP_DISABLE_PIP_VERSION_CHECK=1 \ + PIP_NO_CACHE_DIR=1 \ + PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 \ + PYTHONFAULTHANDLER=1 \ + PYTHONHASHSEED=random +WORKDIR /workspace/app +COPY docs/ docs/ +COPY tests/ tests/ +COPY src/ src/ +RUN pip install -e . +STOPSIGNAL SIGINT +EXPOSE 8000 +ENV BLACKFISH_HOST="0.0.0.0" +ENV BLACKFISH_PORT="8080" +ENV BLACKFISH_HOME_DIR="/data" +ENTRYPOINT ["tini","--" ] +CMD [ "blackfish", "start"] + +VOLUME /workspace/app diff --git a/deploy/prod/Dockerfile b/deploy/prod/Dockerfile new file mode 100644 index 0000000..945acc8 --- /dev/null +++ b/deploy/prod/Dockerfile @@ -0,0 +1,70 @@ +ARG PYTHON_BUILDER_IMAGE=3.11-slim-bookworm + +FROM python:${PYTHON_BUILDER_IMAGE} AS python-base +ENV PIP_DEFAULT_TIMEOUT=100 \ + PIP_DISABLE_PIP_VERSION_CHECK=1 \ + PIP_NO_CACHE_DIR=1 \ + PIP_ROOT_USER_ACTION=ignore \ + PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 \ + PYTHONFAULTHANDLER=1 \ + PYTHONHASHSEED=random \ + LANG=C.UTF-8 \ + LC_ALL=C.UTF-8 +RUN apt-get update \ + && apt-get upgrade -y \ + && apt-get install -y --no-install-recommends git tini \ + && apt-get autoremove -y \ + && apt-get clean -y \ + && rm -rf /root/.cache \ + && rm -rf /var/apt/lists/* \ + && rm -rf /var/cache/apt/* \ + && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false\ + && mkdir -p /workspace/app \ + && pip install --quiet -U pip wheel setuptools virtualenv + +FROM python-base AS build-base +ENV PATH="/workspace/app/.venv/bin:/usr/local/bin:$PATH" +RUN apt-get install -y --no-install-recommends build-essential curl \ + && apt-get autoremove -y \ + && apt-get clean -y \ + && rm -rf /root/.cache \ + && rm -rf /var/apt/lists/* \ + && rm -rf /var/cache/apt/* \ + && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false + +WORKDIR /workspace/app +COPY pyproject.toml README.md .pre-commit-config.yaml LICENSE ./ +# COPY scripts ./scripts/ +# COPY public ./public/ +# COPY resources ./resources/ +RUN python -m venv /workspace/app/.venv + +FROM build-base AS prod-image +ARG ENV_SECRETS="runtime-secrets" +ENV PATH="/workspace/app/.venv/bin:$PATH" \ + VIRTUAL_ENV="/workspace/app/.venv" \ + ENV_SECRETS="${ENV_SECRETS}" \ + PIP_DEFAULT_TIMEOUT=100 \ + PIP_DISABLE_PIP_VERSION_CHECK=1 \ + PIP_NO_CACHE_DIR=1 \ + PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 \ + PYTHONFAULTHANDLER=1 \ + PYTHONHASHSEED=random +WORKDIR /workspace/app +COPY docs/ docs/ +COPY tests/ tests/ +COPY src/ src/ +RUN pip install -e . +STOPSIGNAL SIGINT +EXPOSE 8000 +ENV BLACKFISH_HOST="0.0.0.0" +ENV BLACKFISH_PORT="8080" +ENV BLACKFISH_HOME_DIR="/data" +ENTRYPOINT ["tini","--" ] +CMD [ "blackfish", "start"] + +# docker run -v /var/run/docker.sock:/var/run/docker.sock ... something like this +# is recommended to allow the container to start sibling containers instead of +# running docker-in-docker ("dind"). Equivalent for apptainer? From 8a698b92ed26001baf62f093992afaad37cf872a Mon Sep 17 00:00:00 2001 From: Colin Swaney Date: Tue, 17 Sep 2024 16:16:31 -0400 Subject: [PATCH 2/7] Create LICENSE --- LICENSE | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b25b58b --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2024 Colin Swaney and The Trustees of Princeton University + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 04286aa5299bd18fa53abfd77fa1cc1b0bbae859 Mon Sep 17 00:00:00 2001 From: Colin Swaney Date: Tue, 17 Sep 2024 16:18:07 -0400 Subject: [PATCH 3/7] Bump `huggingface_hub >= 0.25.0` Fixes issue with `RepositoryNotFoundError` that changed locations between minor versions. --- pyproject.toml | 2 +- src/app/utils.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 336cc02..5a7bcd4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,7 @@ dependencies = [ "click", "colorlog", "fabric", - "huggingface_hub", + "huggingface_hub>=0.25", "jinja2", "litestar", "log_symbols", diff --git a/src/app/utils.py b/src/app/utils.py index 9027796..13edfb0 100644 --- a/src/app/utils.py +++ b/src/app/utils.py @@ -2,7 +2,7 @@ import socket from typing import Optional from huggingface_hub import ModelCard, list_repo_commits -from huggingface_hub.utils._errors import RepositoryNotFoundError +from huggingface_hub.errors import RepositoryNotFoundError from fabric.connection import Connection from app.config import BlackfishProfile, SlurmRemote, LocalProfile from app.logger import logger From d5480f08d1c84b1877f5528b3e01e2b76eb8e38c Mon Sep 17 00:00:00 2001 From: Colin Swaney Date: Tue, 17 Sep 2024 16:18:33 -0400 Subject: [PATCH 4/7] Convert port to `int` --- src/app/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/config.py b/src/app/config.py index c37594d..54a7f21 100644 --- a/src/app/config.py +++ b/src/app/config.py @@ -64,7 +64,7 @@ class BlackfishConfig: def __init__(self): self.BLACKFISH_HOST = os.getenv("BLACKFISH_HOST", DEFAULT_HOST) - self.BLACKFISH_PORT = os.getenv("BLACKFISH_PORT", DEFAULT_PORT) + self.BLACKFISH_PORT = int(os.getenv("BLACKFISH_PORT", DEFAULT_PORT)) self.BLACKFISH_HOME_DIR = os.getenv("BLACKFISH_HOME_DIR", DEFAULT_HOME_DIR) self.BLACKFISH_DEBUG = os.getenv("BLACKFISH_DEBUG", DEFAULT_DEBUG) self.BLACKFISH_PROFILES = {} From 6a588485800a417d24b2fdbfb67d598a6dca2728 Mon Sep 17 00:00:00 2001 From: Colin Swaney Date: Thu, 19 Sep 2024 12:41:07 -0400 Subject: [PATCH 5/7] Update Dockerfile --- deploy/prod/Dockerfile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/deploy/prod/Dockerfile b/deploy/prod/Dockerfile index 945acc8..6587028 100644 --- a/deploy/prod/Dockerfile +++ b/deploy/prod/Dockerfile @@ -64,7 +64,3 @@ ENV BLACKFISH_PORT="8080" ENV BLACKFISH_HOME_DIR="/data" ENTRYPOINT ["tini","--" ] CMD [ "blackfish", "start"] - -# docker run -v /var/run/docker.sock:/var/run/docker.sock ... something like this -# is recommended to allow the container to start sibling containers instead of -# running docker-in-docker ("dind"). Equivalent for apptainer? From 8632bf0ccb3e1e5c50061b77b2085980e128db94 Mon Sep 17 00:00:00 2001 From: Colin Swaney Date: Thu, 19 Sep 2024 12:41:43 -0400 Subject: [PATCH 6/7] Reload in `dev` mode --- deploy/dev/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/dev/Dockerfile b/deploy/dev/Dockerfile index c45bd18..64b86f0 100644 --- a/deploy/dev/Dockerfile +++ b/deploy/dev/Dockerfile @@ -63,6 +63,6 @@ ENV BLACKFISH_HOST="0.0.0.0" ENV BLACKFISH_PORT="8080" ENV BLACKFISH_HOME_DIR="/data" ENTRYPOINT ["tini","--" ] -CMD [ "blackfish", "start"] +CMD [ "blackfish", "start", "--reload"] VOLUME /workspace/app From a1f509bd47bb00d4d34a1b54409d7bd6ffeccd93 Mon Sep 17 00:00:00 2001 From: Colin Swaney Date: Thu, 19 Sep 2024 12:42:18 -0400 Subject: [PATCH 7/7] Change port to `8000` --- deploy/dev/Dockerfile | 2 +- deploy/prod/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/dev/Dockerfile b/deploy/dev/Dockerfile index 64b86f0..fd56c74 100644 --- a/deploy/dev/Dockerfile +++ b/deploy/dev/Dockerfile @@ -60,7 +60,7 @@ RUN pip install -e . STOPSIGNAL SIGINT EXPOSE 8000 ENV BLACKFISH_HOST="0.0.0.0" -ENV BLACKFISH_PORT="8080" +ENV BLACKFISH_PORT="8000" ENV BLACKFISH_HOME_DIR="/data" ENTRYPOINT ["tini","--" ] CMD [ "blackfish", "start", "--reload"] diff --git a/deploy/prod/Dockerfile b/deploy/prod/Dockerfile index 6587028..50ee9ed 100644 --- a/deploy/prod/Dockerfile +++ b/deploy/prod/Dockerfile @@ -60,7 +60,7 @@ RUN pip install -e . STOPSIGNAL SIGINT EXPOSE 8000 ENV BLACKFISH_HOST="0.0.0.0" -ENV BLACKFISH_PORT="8080" +ENV BLACKFISH_PORT="8000" ENV BLACKFISH_HOME_DIR="/data" ENTRYPOINT ["tini","--" ] CMD [ "blackfish", "start"]