83d4468b69
Downscale to 2000px JPEG before rembg, random blend opacity, timeout retries, per-variant remix prefill, lightbox, and longer SFTP idle. Co-authored-by: Cursor <cursoragent@cursor.com>
61 lines
2.6 KiB
Docker
61 lines
2.6 KiB
Docker
# Shared image for both the `worker` and `web` services. Which process
|
|
# runs is decided by the `command:` in compose.yml, not by this file.
|
|
FROM debian:bookworm-slim
|
|
|
|
ENV PYTHONUNBUFFERED=1 \
|
|
PYTHONDONTWRITEBYTECODE=1 \
|
|
PIP_NO_CACHE_DIR=1
|
|
|
|
# --- gmic ------------------------------------------------------------------
|
|
# Debian bookworm's own `gmic` apt package is stuck at 2.9.4, whose bundled
|
|
# filter library is missing commands the reference pipeline needs (e.g.
|
|
# `fx_LCE`, one of the fixed POST_FILTERS — that one is not optional, so an
|
|
# old stdlib breaks every single variant, not just a random filter pick).
|
|
# We install the official gmic.eu build for Debian 12 instead (currently
|
|
# 4.0.2), which has these commands built in.
|
|
#
|
|
# Trade-off: that package also pulls in the GIMP-plugin/Qt/GTK stack as
|
|
# hard dependencies (it's one combined .deb for CLI + gimp plugin + zart),
|
|
# adding a few hundred MB we don't otherwise need for a headless CLI tool.
|
|
# Accepted pragmatically here — correctness over image size. If this ever
|
|
# matters, the alternative is compiling gmic from source with `make cli`
|
|
# (see https://gmic.eu/download.html) to skip the GUI dependencies.
|
|
ARG GMIC_DEB_URL=https://gmic.eu/get_file.php?file=linux/gmic_4.0.2_debian12_bookworm_amd64.deb
|
|
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
ca-certificates \
|
|
curl \
|
|
imagemagick \
|
|
python3 \
|
|
python3-pip \
|
|
&& curl -fsSL "$GMIC_DEB_URL" -o /tmp/gmic.deb \
|
|
&& apt-get install -y --no-install-recommends /tmp/gmic.deb \
|
|
&& rm -f /tmp/gmic.deb \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Bake in gmic's community filter definitions at build time (one network
|
|
# fetch, ~6MB) so the wider fx_*/community filter set used by
|
|
# background/foreground name lists resolves without needing outbound
|
|
# internet at runtime. `nice` comes from coreutils (already present).
|
|
ENV HOME=/app/.home
|
|
RUN mkdir -p /app/.home && gmic -update
|
|
|
|
WORKDIR /app
|
|
|
|
COPY requirements.txt .
|
|
# Installing system-wide (no venv) is intentional here: the container
|
|
# itself is the isolation boundary, this is the standard pattern for
|
|
# Python-on-slim-Docker images.
|
|
RUN pip install --break-system-packages -r requirements.txt
|
|
|
|
COPY app ./app
|
|
|
|
# rembg downloads its ONNX model (default u2net) from GitHub on first use
|
|
# and caches it under $HOME/.u2net — persisted via the `rembg_cache`
|
|
# volume in compose.yml so it survives container restarts. Alpha matting
|
|
# is enabled by default (REMBG_ALPHA=1).
|
|
|
|
# Overridden per-service in compose.yml (`worker` -> python -m app.worker,
|
|
# `web` -> uvicorn app.main:app).
|
|
CMD ["python3", "-m", "app.worker"]
|