|
1 | | -FROM node:20.19.5-bookworm AS builder |
| 1 | +FROM us-docker.pkg.dev/sentryio/dhi/node:24-debian13-dev AS builder |
2 | 2 |
|
3 | | -COPY package.json yarn.lock . |
| 3 | +WORKDIR /build |
| 4 | + |
| 5 | +COPY package.json yarn.lock ./ |
4 | 6 | RUN yarn install --frozen-lockfile |
5 | 7 |
|
6 | 8 | COPY tsconfig.json . |
7 | 9 | COPY src src |
8 | 10 | RUN yarn build |
9 | 11 |
|
10 | | -FROM node:20.19.5-bookworm-slim |
| 12 | +# Drop devDependencies from node_modules for the runtime image |
| 13 | +RUN yarn install --frozen-lockfile --production |
| 14 | + |
| 15 | +# canvas 3.x bundles its graphics libs (libcairo, libpango, etc.) but some of |
| 16 | +# those bundled libs still need system libs absent from the minimal runtime image. |
| 17 | +# Use ldd to auto-detect all transitive system dependencies of every native module |
| 18 | +# so this stays correct when canvas or any other native dependency is updated. |
| 19 | +RUN mkdir -p /canvas-sys-libs && \ |
| 20 | + find /build/node_modules -name "*.node" | \ |
| 21 | + xargs ldd 2>/dev/null | \ |
| 22 | + awk '/=> \// { print $3 }' | \ |
| 23 | + grep -v '^/build' | \ |
| 24 | + sort -u | \ |
| 25 | + while IFS= read -r lib; do \ |
| 26 | + real=$(readlink -f "$lib"); \ |
| 27 | + cp --parents "$real" /canvas-sys-libs/ 2>/dev/null || true; \ |
| 28 | + usr="${lib/#\/lib\//\/usr\/lib\/}"; \ |
| 29 | + [ "$usr" != "$real" ] && \ |
| 30 | + ln -sf "$(basename "$real")" "/canvas-sys-libs$usr" 2>/dev/null || true; \ |
| 31 | + done |
| 32 | + |
| 33 | +# canvas bundles libfontconfig but needs /etc/fonts/fonts.conf to initialise. |
| 34 | +# Without it fontconfig silently fails and all text renders as box glyphs. |
| 35 | +RUN apt-get update -qq && \ |
| 36 | + apt-get install -qq -y --no-install-recommends fontconfig && \ |
| 37 | + rm -rf /var/lib/apt/lists/* |
| 38 | + |
| 39 | + |
| 40 | +FROM us-docker.pkg.dev/sentryio/dhi/node:24-debian13 |
11 | 41 |
|
12 | 42 | ENV NODE_ENV=production |
13 | 43 |
|
14 | | -RUN apt-get update && apt-get install -y --no-install-recommends \ |
15 | | - build-essential \ |
16 | | - libcairo2-dev \ |
17 | | - libpango1.0-dev \ |
18 | | - libpangocairo-1.0-0 \ |
19 | | - libjpeg-dev \ |
20 | | - libgif-dev \ |
21 | | - librsvg2-dev \ |
22 | | - && rm -rf /var/lib/apt/lists/* |
23 | | - |
24 | 44 | WORKDIR /usr/src/app |
25 | 45 |
|
26 | | -COPY package.json yarn.lock ./ |
27 | | -RUN yarn install --frozen-lockfile |
28 | | - |
| 46 | +COPY package.json ./ |
29 | 47 | COPY fonts fonts |
30 | | -COPY --from=builder lib lib |
31 | | - |
32 | | -RUN node lib/index.js --help |
| 48 | +COPY --from=builder /build/node_modules node_modules |
| 49 | +COPY --from=builder /build/lib lib |
| 50 | +COPY --from=builder /canvas-sys-libs/usr/lib/ /usr/lib/ |
| 51 | +COPY --from=builder /etc/fonts/ /etc/fonts/ |
| 52 | +COPY --from=builder /usr/share/fonts/ /usr/share/fonts/ |
| 53 | +COPY smoketest.js . |
| 54 | + |
| 55 | +RUN ["node", "smoketest.js"] |
33 | 56 |
|
34 | 57 | EXPOSE 9090/tcp |
35 | 58 | CMD ["node", "./lib/index.js", "server", "9090"] |
0 commit comments