1
1
# syntax=docker/dockerfile:1
2
- FROM python:3.10 as base
2
+ FROM python:3.10 AS base
3
3
SHELL ["/bin/bash", "--login", "-c"]
4
4
5
5
# Useful for installing deps from git, preventing big downloads and bandwith quotas
@@ -16,24 +16,29 @@ FROM base as app
16
16
17
17
WORKDIR /app
18
18
19
- # Set up uv venv in /opt/.venv to avoid polluting the mounted /app dir
20
- RUN pip install uv
19
+ COPY --from=ghcr.io/astral-sh/uv:0.4 /uv /usr/local/bin/uv
20
+ ENV UV_LINK_MODE=copy \
21
+ UV_COMPILE_BYTECODE=1 \
22
+ UV_PYTHON_DOWNLOADS=never \
23
+ UV_PROJECT_ENVIRONMENT=/opt/.venv \
24
+ UV_PYTHON=python3.10
25
+
21
26
WORKDIR /opt
27
+ COPY pydatalab/pyproject.toml /_lock/
28
+ COPY pydatalab/uv.lock /_lock/
29
+ COPY pydatalab/requirements/requirements-all.txt /_lock/
22
30
RUN uv venv
31
+ RUN uv pip install -r /_lock/requirements-all.txt
23
32
24
- COPY pydatalab/requirements/requirements-all.txt .
25
- RUN uv pip install -r requirements-all.txt
26
-
27
- WORKDIR /app
28
- COPY pydatalab/pyproject.toml .
29
33
# Create development image using flask's dev server with hot-reload
30
34
FROM app as development
31
35
32
- ENV FLASK_APP "pydatalab.main:create_app()"
36
+
37
+ WORKDIR /app
38
+ ENV FLASK_APP "pydatalab.main"
33
39
ENV FLASK_ENV "development"
34
40
ENV PORT=5001
35
-
36
- CMD ["/bin/bash", "-c", "/opt/.venv/bin/python -m flask run --reload --port ${PORT} --host 0.0.0.0"]
41
+ CMD [ "/bin/bash", "-c", "source /opt/.venv/bin/activate && exec flask run --reload --port ${PORT} --host 0.0.0.0" ]
37
42
38
43
# Create production image using gunicorn and minimal dependencies
39
44
FROM app as production
@@ -54,8 +59,8 @@ ENV PORT=${PORT}
54
59
55
60
# Install the local version of the package and mount the repository data to get version info
56
61
RUN git config --global --add safe.directory /
57
- RUN --mount=type=bind,target=/.git,source=./.git ["uv", "pip", "install", "--python", "/opt/.venv/bin/python", "."]
62
+ RUN --mount=type=bind,target=/.git,source=./.git ["uv", "pip", "install", "--python", "/opt/.venv/bin/python", "--no-deps", " ."]
58
63
59
64
CMD ["/bin/bash", "-c", "/opt/.venv/bin/python -m gunicorn --preload -w ${WEB_CONCURRENCY} --error-logfile /logs/pydatalab_error.log --access-logfile - -b 0.0.0.0:${PORT} 'pydatalab.main:create_app()'"]
60
65
61
- HEALTHCHECK --interval=30s --timeout=30s --start-interval=5s --start-period=30s --retries=3 CMD curl --fail http://localhost:${PORT}/healthcheck/is_ready || exit 1
66
+ HEALTHCHECK --interval=30s --timeout=30s --start-interval=15s --start-period=30s --retries=3 CMD curl --fail http://localhost:${PORT}/healthcheck/is_ready || exit 1
0 commit comments