diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8f6a6ca --- /dev/null +++ b/Dockerfile @@ -0,0 +1,64 @@ +########### +# BUILDER # +########### + +# pull official base image +FROM python:3.12-slim-bullseye as BUILDER + +# set environment variables +ENV PYTHONUNBUFFERED=1 \ + PYTHONDONTWRITEBYTECODE=1 \ + PIP_NO_CACHE_DIR=off \ + PIP_DISABLE_PIP_VERSION_CHECK=ON \ + PIP_DEFAULT_TIMEOUT=100 \ + DEBIAN_FRONTEND=noninteractive \ + POETRY_HOME=/etc/poetry \ + POETRY_VERSION=1.7.1 \ + POETRY_VIRTUALENVS_IN_PROJECT=1 \ + POETRY_VIRTUALENVS_CREATE=1 \ + POETRY_NO_INTERACTION=1 \ + POETRY_CACHE_DIR=/tmp/poetry_cache \ + APP_HOME=/home/app + +# update system +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + build-essential \ + curl \ + && apt-get clean + +# install poetry +RUN curl -sSL https://install.python-poetry.org | python3 - +ENV PATH="${POETRY_HOME}/bin:$PATH" + +# install runtime dependencies +WORKDIR ${APP_HOME} +COPY poetry.lock pyproject.toml ./ +RUN --mount=type=cache,target=${POETRY_CACHE_DIR} poetry install --no-root + +######### +# FINAL # +######### + +# pull official base image +FROM python:3.12-slim-bullseye + +# copy virtualenv made by poetry +ENV APP_HOME=/home/app \ + VIRTUAL_ENV=/home/app/.venv +COPY --from=builder ${VIRTUAL_ENV} ${VIRTUAL_ENV} +ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" + +# create home directory and app user +RUN mkdir -p /home/app && \ + addgroup --system app && \ + adduser --system --group app + +# add code while changing ownership +WORKDIR $APP_HOME +COPY --chown=app:app ./src . + +# change to the app user +USER app + +ENTRYPOINT [ "gunicorn", "web:server", "-b", "0.0.0.0:8050" ] \ No newline at end of file diff --git a/docker-compose.local.yml b/docker-compose.local.yml new file mode 100644 index 0000000..7f01e12 --- /dev/null +++ b/docker-compose.local.yml @@ -0,0 +1,15 @@ +services: + app: + image: visual_critical_discourse_analysis:dev + container_name: visual_critical_discourse_analysis + build: + context: . + dockerfile: Dockerfile + ports: + - 8050:8050 + networks: + - backend + +networks: + backend: + external: false \ No newline at end of file