Files
yawn/Dockerfile
T
Ampandheaust d71da85307 Fix Docker deployment inputs
Include all addon workspaces and vendored dependencies in image builds, and expose deploy time plus commit metadata on the home page.

Amp-Thread-ID: https://ampcode.com/threads/T-01a033d4-0e44-708e-af0e-6166283416ff
Co-authored-by: Heaust Azure <heaust.azure@gmail.com>
2026-08-24 18:30:45 +00:00

76 lines
2.7 KiB
Docker

# syntax=docker/dockerfile:1
FROM node:22-bookworm AS package-builder
RUN apt-get update \
&& apt-get install -y --no-install-recommends build-essential ca-certificates curl libssl-dev pkg-config \
&& rm -rf /var/lib/apt/lists/*
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
| sh -s -- -y --profile minimal --default-toolchain stable
ENV PATH="/root/.cargo/bin:${PATH}"
RUN cargo install wasm-pack --version 0.15.0 --locked
WORKDIR /src
COPY Cargo.toml Cargo.lock rust-toolchain.toml ./
COPY .cargo ./.cargo
RUN toolchain="$(sed -n 's/^channel = "\([^"]*\)"/\1/p' rust-toolchain.toml)" \
&& rustup toolchain install "$toolchain" --profile minimal --component rust-src --target wasm32-unknown-unknown
COPY package.json package-lock.json ./
COPY core/package.json ./core/package.json
COPY addons ./addons
COPY vendor ./vendor
RUN --mount=type=cache,target=/root/.npm npm ci --include=dev
COPY core ./core
COPY server/build.mjs ./server/build.mjs
RUN --mount=type=cache,target=/src/target mkdir -p /out \
&& wasm-pack build core --target web --out-dir /out/pkg --release \
&& node server/build.mjs /src /out
FROM golang:1.24-bookworm AS server-builder
WORKDIR /src
COPY go.work ./
COPY server/go.mod server/go.sum ./server/
RUN --mount=type=cache,target=/go/pkg/mod go mod download
COPY server ./server
RUN --mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
CGO_ENABLED=1 go test ./server/... \
&& CGO_ENABLED=1 go build -trimpath -ldflags="-s -w" -o /out/yawn-server ./server
FROM debian:bookworm-slim AS runtime
ARG YAWN_DEPLOYED_AT=""
ARG YAWN_DEPLOY_COMMIT_MESSAGE=""
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates curl \
&& rm -rf /var/lib/apt/lists/* \
&& groupadd --system --gid 10001 yawn \
&& useradd --system --uid 10001 --gid yawn --home-dir /app --create-home yawn \
&& mkdir -p /data \
&& chown yawn:yawn /data
WORKDIR /app
COPY --from=server-builder --chown=yawn:yawn /out/yawn-server /app/yawn-server
COPY --from=package-builder --chown=yawn:yawn /out /app/packages
COPY --from=package-builder --chown=yawn:yawn /src/node_modules/monaco-editor/min /app/node_modules/monaco-editor/min
ENV PORT=5002 \
YAWN_ROOT=/app \
YAWN_PACKAGES=/app/packages \
YAWN_DATABASE=/data/yawn.db \
YAWN_DEPLOYED_AT="${YAWN_DEPLOYED_AT}" \
YAWN_DEPLOY_COMMIT_MESSAGE="${YAWN_DEPLOY_COMMIT_MESSAGE}"
USER yawn:yawn
VOLUME ["/data"]
EXPOSE 5002
STOPSIGNAL SIGTERM
HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --retries=3 \
CMD curl --fail --silent --show-error "http://127.0.0.1:${PORT}/healthz" || exit 1
ENTRYPOINT ["/app/yawn-server"]