From 212870fd336a7b171dd2f487c54be136d2af9d01 Mon Sep 17 00:00:00 2001 From: m9k Date: Sun, 27 Sep 2026 13:41:31 +0000 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20PrettyMaps/Dockerfile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PrettyMaps/Dockerfile | 153 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 PrettyMaps/Dockerfile diff --git a/PrettyMaps/Dockerfile b/PrettyMaps/Dockerfile new file mode 100644 index 0000000..01a3177 --- /dev/null +++ b/PrettyMaps/Dockerfile @@ -0,0 +1,153 @@ +# syntax=docker/dockerfile:1 +# +# Build without proxy: +# DOCKER_BUILDKIT=1 docker build -t prettymaps-docker-test . +# +# Build with SOCKS5 proxy: +# DOCKER_BUILDKIT=1 docker build --network=host \ +# --build-arg PROXY_SOCKS5=$PROXY_IP:$PROXY_PORT \ +# -t prettymaps-docker-test . +# +# Do not upgrade pip (newer pip+urllib3 may break SOCKS). +# Pre-install shapely to avoid resolver loops on shapely[vectorized]. + +# -------------------------------------------------------------------------- +# Stage 1: builder +# -------------------------------------------------------------------------- + +FROM debian:bookworm-slim AS builder + +ARG PROXY_SOCKS5="" +ARG DEBIAN_FRONTEND=noninteractive + +ENV LANG=C.UTF-8 \ + LC_ALL=C.UTF-8 \ + PYTHONUNBUFFERED=1 \ + PIP_DISABLE_PIP_VERSION_CHECK=1 \ + PIP_DEFAULT_TIMEOUT=120 \ + PIP_PREFER_BINARY=1 + +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + rm -f /etc/apt/apt.conf.d/docker-clean && \ + apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + python3 \ + python3-pip \ + python3-venv \ + python3-dev \ + python3-socks \ + build-essential \ + gdal-bin \ + libgdal-dev \ + libgeos-dev \ + libproj-dev \ + libspatialindex-dev \ + git \ + fonts-dejavu-core + +# Python environment +RUN python3 -m venv --system-site-packages /opt/venv + +ENV PATH="/opt/venv/bin:$PATH" + +# Optional SOCKS5 proxy. +# Empty PROXY_SOCKS5 disables the proxy. +# Proxy settings apply only to the builder stage. + +ENV ALL_PROXY=${PROXY_SOCKS5:+socks5h://}${PROXY_SOCKS5} + +ENV HTTP_PROXY=${ALL_PROXY} \ + HTTPS_PROXY=${ALL_PROXY} \ + http_proxy=${ALL_PROXY} \ + https_proxy=${ALL_PROXY} \ + no_proxy=localhost,127.0.0.1 + +# -------------------------------------------------------------------------- +# Python dependencies +# -------------------------------------------------------------------------- + +# 1. Base tooling, NumPy and Shapely + +RUN --mount=type=cache,target=/root/.cache/pip \ + pip install \ + setuptools \ + wheel \ + pysocks \ + "numpy>=1.26.4" \ + "shapely>=2.0.0" + +# 2. Prettymaps runtime dependencies +# Streamlit and Marimo are intentionally excluded. + +RUN --mount=type=cache,target=/root/.cache/pip \ + pip install \ + "matplotlib>=3.9.0" \ + "osmnx>=2.0.5" \ + "rasterio>=1.4.3" \ + "rioxarray>=0.18.2" \ + "opencv-python-headless>=4.11.0.86" \ + "scikit-image>=0.25.2" \ + "thefuzz>=0.22.1" \ + "elevation>=1.1.3" \ + "tqdm>=4.70.0" \ + "scikit-learn>=1.6.1" \ + "vsketch>=1.0.0" \ + "ipython" \ + "ipykernel>=6.29.5" + +# 3. Prettymaps without optional dependencies + +RUN --mount=type=cache,target=/root/.cache/pip \ + pip install prettymaps --no-deps + +# -------------------------------------------------------------------------- +# Stage 2: runtime +# -------------------------------------------------------------------------- + +FROM debian:bookworm-slim AS runtime + +ARG DEBIAN_FRONTEND=noninteractive + +ENV LANG=C.UTF-8 \ + LC_ALL=C.UTF-8 \ + PYTHONUNBUFFERED=1 \ + PATH="/opt/venv/bin:$PATH" + +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + rm -f /etc/apt/apt.conf.d/docker-clean && \ + apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates \ + python3 \ + python3-socks \ + gdal-bin \ + libgdal32 \ + libgeos-c1v5 \ + libproj25 \ + libspatialindex6 \ + fonts-dejavu-core \ + libgl1 \ + libglib2.0-0 \ + libxkbcommon0 \ + libdbus-1-3 \ + libxcb-cursor0 \ + libxcb-xinerama0 + +# Copy Python virtual environment +COPY --from=builder /opt/venv /opt/venv + +# Application +WORKDIR /work + +VOLUME /work + +COPY generate.py /opt/generate.py + +# Prefer user-provided script from /work. +# Fall back to the bundled script. + +ENTRYPOINT ["sh", "-c", "script=generate.py; if [ -f \"/work/$script\" ]; then exec python3 \"/work/$script\" \"$@\"; else exec python3 \"/opt/$script\" \"$@\"; fi", "--"] + +CMD [] \ No newline at end of file