# STAGE 1: BUILDER # Contains all build tools and dev dependencies, will be discarded FROM python:3.13-slim-bullseye AS builder # Install system dependencies RUN set -x && \ BUILD_DEPS="build-essential cmake libffi-dev libfreetype6-dev libfontconfig1-dev libpng-dev libjpeg-dev libssl-dev libxft-dev make python3-dev python3-setuptools python3-wheel" && \ RUNTIME_DEPS="bash ca-certificates chrpath locales locales-all libfreetype6 libfontconfig1 p7zip-full python3 python3-pip libgl1" && \ DEBIAN_FRONTEND=noninteractive apt-get update -y && \ apt-get install -y --no-install-recommends ${BUILD_DEPS} ${RUNTIME_DEPS} RUN \ set -x && \ python -m venv /opt/venv && \ . /opt/venv/bin/activate && \ pip install --upgrade pip # Install numpy first, as it is unlikely to change and takes too long to compile RUN \ set -x && \ . /opt/venv/bin/activate && \ pip install --no-cache-dir numpy==2.3.4 # Install PyMuPDF separately, as it is likely to change but still takes too long to compile RUN \ set -x && \ . /opt/venv/bin/activate && \ pip install --no-cache-dir PyMuPDF==1.26.6 # Install Python dependencies using virtual environment COPY requirements-docker.txt . RUN \ set -x && \ . /opt/venv/bin/activate && \ pip install --no-cache-dir -r requirements-docker.txt # STAGE 2: FINAL # Clean, small and secure image with only runtime dependencies FROM python:3.13-slim-bullseye # Install runtime dependencies only RUN \ set -x && \ DEBIAN_FRONTEND=noninteractive apt-get update -y && \ apt-get install -y --no-install-recommends p7zip-full && \ rm -rf /var/lib/apt/lists/* # Copy artifacts from builder COPY --from=builder /opt/venv /opt/venv COPY . /opt/kcc/ WORKDIR /opt/kcc ENV PATH="/opt/venv/bin:$PATH" # Setup executable and version file RUN \ chmod +x /opt/kcc/entrypoint.sh && \ ln -s /opt/kcc/kcc-c2e.py /usr/local/bin/c2e && \ ln -s /opt/kcc/kcc-c2p.py /usr/local/bin/c2p && \ ln -s /opt/kcc/entrypoint.sh /usr/local/bin/entrypoint && \ ln -s /opt/kcc/kindlegen/kindlegen /usr/local/bin/kindlegen && \ cat /opt/kcc/kindlecomicconverter/__init__.py | grep version | awk '{print $3}' | sed "s/'//g" > /IMAGE_VERSION LABEL com.kcc.name="Kindle Comic Converter" \ com.kcc.author="Ciro Mattia Gonano, Paweł Jastrzębski and Darodi" \ org.opencontainers.image.title="Kindle Comic Converter" \ org.opencontainers.image.description='Kindle Comic Converter' \ org.opencontainers.image.documentation='https://github.com/ciromattia/kcc' \ org.opencontainers.image.source='https://github.com/ciromattia/kcc' \ org.opencontainers.image.authors='Darodi and José Cerezo' \ org.opencontainers.image.url='https://github.com/ciromattia/kcc' \ org.opencontainers.image.vendor='ciromattia' \ org.opencontainers.image.licenses='ISC' ENTRYPOINT ["entrypoint"] CMD ["-h"]