-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile.dev
More file actions
150 lines (130 loc) · 5.72 KB
/
Dockerfile.dev
File metadata and controls
150 lines (130 loc) · 5.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# =============================================================================
# Development Container for pdfbro
# =============================================================================
# This container provides a full development environment with:
# - Rust toolchain (with cargo-watch for hot reload)
# - Chromium (Chrome) for HTML/URL/Markdown to PDF conversion
# - LibreOffice for Office document conversion
# - All fonts and dependencies
#
# Usage:
# docker compose up pdfbro-dev
# # Or with make:
# make dev
# =============================================================================
ARG RUST_VERSION=1.88
ARG CHROMIUM_VERSION=142.0.7444.175-1
# =============================================================================
# Stage: dev-base — Rust toolchain + dev tools
# =============================================================================
FROM rust:${RUST_VERSION} AS dev-base
# Install cargo-watch for hot reload
RUN cargo install cargo-watch --locked
# Install system dependencies
RUN apt-get update -qq && apt-get upgrade -yqq && \
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends \
# Basic dev tools
git \
curl \
ca-certificates \
# Build essentials
build-essential \
pkg-config \
libssl-dev \
# PDF tools
qpdf \
ghostscript \
# Fonts
fonts-crosextra-carlito \
fonts-crosextra-caladea \
fonts-liberation \
fonts-liberation2 \
fonts-dejavu \
fonts-noto-cjk \
fonts-noto-color-emoji \
fonts-noto \
fontconfig \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
WORKDIR /app
# =============================================================================
# Stage: dev-chromium — dev-base + Chromium
# =============================================================================
FROM dev-base AS dev-chromium
ARG CHROMIUM_VERSION
# Install Chromium
RUN /bin/bash -c \
'set -e; \
ARCH="$(dpkg --print-architecture)"; \
if [[ -n "$CHROMIUM_VERSION" && "$CHROMIUM_VERSION" != "latest" && \
("$ARCH" == "amd64" || "$ARCH" == "arm64") ]]; then \
apt-get update -qq && \
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends devscripts && \
debsnap chromium-common "$CHROMIUM_VERSION" -v --force --binary --architecture "$ARCH" && \
debsnap chromium "$CHROMIUM_VERSION" -v --force --binary --architecture "$ARCH" && \
dpkg -i --force-depends \
"./binary-chromium-common/chromium-common_${CHROMIUM_VERSION}_${ARCH}.deb" \
"./binary-chromium/chromium_${CHROMIUM_VERSION}_${ARCH}.deb" && \
apt-get install -f -y -qq --no-install-recommends || true && \
DEBIAN_FRONTEND=noninteractive apt-get purge -y -qq devscripts && \
rm -rf ./binary-chromium-common ./binary-chromium; \
else \
apt-get update -qq && \
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends chromium; \
fi' \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Install Chromium runtime libraries
RUN apt-get update -qq && \
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends \
libgtk-3-0 libx11-xcb1 libxcomposite1 libxcursor1 \
libxdamage1 libxi6 libxtst6 libnss3 libcups2 libxss1 \
libxrandr2 libasound2 libatk1.0-0 libatk-bridge2.0-0 \
libpangocairo-1.0-0 libpango-1.0-0 libcairo2 \
libgdk-pixbuf2.0-0 libglib2.0-0 libgl1-mesa-glx \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
ENV CHROME_PATH=/usr/bin/chromium
ENV CHROME_BIN=/usr/bin/chromium
ENV RUST_LOG=info,chromiumoxide::handler=error
# =============================================================================
# Stage: pdfbro-dev — Full dev environment (Chromium + LibreOffice)
# =============================================================================
FROM dev-chromium AS pdfbro-dev
# Install LibreOffice from bookworm-backports
RUN echo "deb http://deb.debian.org/debian bookworm-backports main" \
> /etc/apt/sources.list.d/backports.list && \
apt-get update -qq && \
DEBIAN_FRONTEND=noninteractive apt-get install -y -t bookworm-backports --no-install-recommends \
libreoffice-writer \
libreoffice-calc \
libreoffice-impress \
libreoffice-draw \
python3-uno && \
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
python3-minimal \
python3-pip && \
pip3 install --no-cache-dir --break-system-packages unoserver==2.2.1 && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
ENV SAL_USE_VCLPLUGIN=svp
ENV GS_BIN=/usr/bin/gs
# Create non-root user for running Chrome
RUN groupadd --gid 1001 pdfbro && \
useradd --uid 1001 --gid pdfbro --shell /bin/bash \
--home /home/pdfbro --create-home pdfbro
# Pre-build dependencies for faster startup
# This layer will be cached; source code changes won't invalidate it
COPY Cargo.toml Cargo.lock ./
COPY crates/*/Cargo.toml ./crates/*/
RUN mkdir -p crates/engine/src crates/server/src crates/cli/src && \
echo "fn main() {}" > crates/cli/src/main.rs && \
echo "pub fn dummy() {}" > crates/engine/src/lib.rs && \
echo "pub fn dummy() {}" > crates/server/src/lib.rs && \
cargo build --features "chromium libreoffice" 2>/dev/null || true && \
rm -rf crates/
# Set up working directory with proper permissions
RUN chown -R pdfbro:pdfbro /app
# Switch to non-root user for Chrome
USER pdfbro
WORKDIR /app
EXPOSE 3000
# Default command: watch for changes and restart server
# Use --poll for Docker compatibility (file system events may not work in all setups)
CMD ["cargo", "watch", "--poll", "-x", "run -p server -- serve --port 3000 --host 0.0.0.0"]