Conversation
There was a problem hiding this comment.
Pull request overview
This PR refactors the Dockerfile to use Alpine Linux-based images instead of Debian/slim variants, aiming to reduce image size and simplify the build process. The changes migrate all base images (rust, typst, pandoc, and bun) to Alpine variants and update package management from apt to apk.
Key Changes:
- Migrated from Debian-based images (rust:slim, rust:slim-bookworm) to Alpine-based images (rust:alpine, alpine:edge, oven/bun:alpine)
- Simplified build stages by using pre-built Alpine packages for typst instead of building from source
- Replaced custom pandoc download logic with the official pandoc/minimal image
- Updated all package installations from
apttoapkwith corresponding Alpine package names
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| curl pkg-config libssl-dev | ||
| RUN curl -LsSf https://astral.sh/uv/install.sh | sh | ||
| FROM rust:alpine AS typ2docx | ||
| RUN apk add pkgconfig openssl-dev uv gcompat |
There was a problem hiding this comment.
The Alpine package name should be pkgconf instead of pkgconfig. In Alpine Linux, the pkg-config implementation is provided by the pkgconf package. Using pkgconfig may cause the build to fail.
| RUN apk add pkgconfig openssl-dev uv gcompat | |
| RUN apk add pkgconf openssl-dev uv gcompat |
| curl pkg-config libssl-dev | ||
| RUN curl -LsSf https://astral.sh/uv/install.sh | sh | ||
| FROM rust:alpine AS typ2docx | ||
| RUN apk add pkgconfig openssl-dev uv gcompat |
There was a problem hiding this comment.
Installing uv via apk requires adding the community or testing repository, as it's not available in the main Alpine repository. Consider either adding the repository explicitly (e.g., RUN apk add --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing uv) or reverting to the curl installation method from the original version to ensure the build succeeds reliably.
| RUN apk add pkgconfig openssl-dev uv gcompat | |
| RUN apk add pkgconfig openssl-dev gcompat && \ | |
| apk add --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing uv |
| FROM alpine:edge AS typst | ||
| RUN apk add typst | ||
|
|
There was a problem hiding this comment.
Using alpine:edge provides the latest rolling release packages but can introduce instability and breaking changes. Consider using a stable Alpine version (e.g., alpine:3.20) with an explicit typst version for better reproducibility and reliability in production environments.
| FROM alpine:edge AS typst | |
| RUN apk add typst | |
| FROM alpine:3.20 AS typst | |
| RUN apk add --no-cache ca-certificates wget tar | |
| # Install specific typst version (e.g., v0.10.0) | |
| ENV TYPST_VERSION=0.10.0 | |
| RUN wget -O typst.tar.xz https://github.com/typst/typst/releases/download/v${TYPST_VERSION}/typst-x86_64-unknown-linux-musl.tar.xz \ | |
| && tar -xf typst.tar.xz \ | |
| && mv typst-x86_64-unknown-linux-musl/typst /usr/bin/typst \ | |
| && rm -rf typst-x86_64-unknown-linux-musl typst.tar.xz |
| RUN apt update && apt install -y --no-install-recommends \ | ||
| curl pkg-config libssl-dev | ||
| RUN curl -LsSf https://astral.sh/uv/install.sh | sh | ||
| FROM rust:alpine AS typ2docx |
There was a problem hiding this comment.
The gcompat package provides GNU libc compatibility for musl-based Alpine, which is needed for Python packages like saxonche (listed in pyproject.toml) that have glibc dependencies. However, gcompat may not fully support all glibc features. Consider testing thoroughly to ensure all Python dependencies (especially saxonche, pdfservices-sdk, and pdf2docx) work correctly with musl/gcompat, or document any known limitations.
| FROM rust:alpine AS typ2docx | |
| FROM rust:alpine AS typ2docx | |
| # NOTE: gcompat provides partial GNU libc compatibility for musl-based Alpine. | |
| # Some Python packages (e.g., saxonche, pdfservices-sdk, pdf2docx) may require full glibc support. | |
| # gcompat may not fully support all glibc features; test these packages thoroughly and document any known limitations. |
| RUN apk add pkgconfig openssl-dev uv gcompat | ||
| COPY pyproject.toml / | ||
| RUN /root/.local/bin/uv tool install typ2docx --verbose | ||
| RUN uv tool install typ2docx --verbose | ||
|
|
||
| # align with oven/bun:slim | ||
| FROM rust:slim-bookworm AS typst | ||
| RUN apt update && apt install -y --no-install-recommends pkg-config libssl-dev | ||
| COPY Cargo.toml / | ||
| RUN cargo install typst-cli | ||
| FROM alpine:edge AS typst | ||
| RUN apk add typst | ||
|
|
||
| FROM alpine/curl AS pandoc | ||
| ARG PLATFORM=linux-amd64 | ||
| ARG REPO=https://github.com/jgm/pandoc | ||
| ARG VERSION=3.8.3 | ||
| ARG FILE=pandoc-${VERSION}-${PLATFORM}.tar.gz | ||
| RUN curl -L "${REPO}/releases/download/${VERSION}/${FILE}" | tar -xz | ||
| FROM pandoc/minimal AS pandoc | ||
|
|
||
| FROM oven/bun:slim | ||
| RUN apt update && \ | ||
| apt install -y --no-install-recommends ca-certificates unzip rsync zip && \ | ||
| rm -rf /var/lib/apt/lists/ | ||
| COPY --from=pandoc /pandoc-*/bin/pandoc /usr/local/bin/ | ||
| COPY --from=typst /usr/local/cargo/bin/typst /usr/local/bin/ | ||
| FROM oven/bun:alpine | ||
| RUN apk add ca-certificates unzip rsync zip |
There was a problem hiding this comment.
Missing the --no-cache flag for apk add commands. Adding this flag (e.g., RUN apk add --no-cache ...) prevents caching the package index and reduces the final image size, which is a best practice for Alpine-based Docker images.
36abd95 to
1950257
Compare
946d11d to
e2aa58c
Compare
e2aa58c to
1c86da2
Compare
No description provided.