One image (gitea.reeseapps.com/experimental/mirror), tagged :main on main and a version tag on release, exactly like brain-of-reese — plus a `test` job the publish job `needs`. A red pipeline therefore leaves :main on the last good build, which is what podman auto-update keeps serving: red means nothing shipped, not that production broke. The test job runs unit + API only and --ignores tests/e2e rather than deselecting it: -m filtering happens after collection, and tests/e2e/conftest.py imports playwright, so a marker alone would not keep the browser suite out of a container that has no browser. The e2e and realdisplay rungs stay local gates (AGENTS.md), and pyright is not in CI either, since the python container has no node to run it with — that asymmetry is written down rather than pretended away. The image sheds curl and its HEALTHCHECK: health belongs to the deployment (HealthCmd in the quadlet, which probes with the python already in the image), so the runtime image no longer ships a package that exists only to answer /healthz — and no longer contains a way to make outbound requests, which is consistent with a server that dials nothing. 171 MB to 157 MB. The image source label points at the real repo now instead of example.invalid. Verified locally with podman 5.8: the image builds, `mirror --help` exits 0, and it serves on 8080 when MIRROR_PORT says 8080. LLM-Generated: true
50 lines
1.5 KiB
Docker
50 lines
1.5 KiB
Docker
# mirror — browser-only screen mirroring.
|
|
#
|
|
# podman build -t mirror .
|
|
# podman run --rm -p 8055:8055 mirror
|
|
#
|
|
# The image serves the app; it does not capture anything. Capture happens in the
|
|
# viewer's and sharer's own browsers, so there is no display, D-Bus, or PipeWire
|
|
# socket to pass in.
|
|
#
|
|
# Deliberately no HTTP client and no HEALTHCHECK: health checks belong to the
|
|
# deployment (see HealthCmd in the reeseapps/mirror quadlet), and shipping curl
|
|
# only to answer /healthz adds a package and a way for someone inside the
|
|
# container to make requests the image otherwise cannot make.
|
|
|
|
FROM docker.io/library/python:3.13-slim AS builder
|
|
|
|
ENV PIP_DISABLE_PIP_VERSION_CHECK=1 UV_LINK_MODE=copy
|
|
RUN pip install --no-cache-dir uv
|
|
|
|
WORKDIR /app
|
|
COPY pyproject.toml README.md ./
|
|
COPY src ./src
|
|
RUN uv venv /opt/venv \
|
|
&& uv pip install --python /opt/venv/bin/python --no-cache .
|
|
|
|
|
|
FROM docker.io/library/python:3.13-slim
|
|
|
|
LABEL org.opencontainers.image.title="mirror" \
|
|
org.opencontainers.image.description="Browser-only screen mirroring for the local network" \
|
|
org.opencontainers.image.source="https://gitea.reeseapps.com/experimental/mirror" \
|
|
org.opencontainers.image.licenses="MIT"
|
|
|
|
COPY --from=builder /opt/venv /opt/venv
|
|
ENV PATH="/opt/venv/bin:${PATH}" \
|
|
PYTHONUNBUFFERED=1 \
|
|
PYTHONDONTWRITEBYTECODE=1 \
|
|
MIRROR_HOST=0.0.0.0 \
|
|
MIRROR_PORT=8055
|
|
|
|
# Never run the web process as root.
|
|
RUN useradd --create-home --shell /usr/sbin/nologin mirror
|
|
USER mirror
|
|
WORKDIR /home/mirror
|
|
|
|
EXPOSE 8055
|
|
|
|
ENTRYPOINT ["mirror"]
|
|
CMD ["serve"]
|