Ctrl K
ComunidadGuías…

Dockerfile

Rama dev · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
ARG VERSION=dev
ARG COMMIT=""
ARG SOURCE_REPOSITORY=Kirari04/p2pstream
ARG RELEASE_CHANNEL=development
ARG VITE_RELEASE_REPOSITORY=""
ARG VITE_RELEASE_REF=""

FROM oven/bun:1.4.4@sha256:1d22548f177f4ff38e0c15baa3c2c46c6c2060ba2d1bc573bb4720b407548f1d AS bun

FROM bun AS frontend
WORKDIR /app/web/management
ARG VITE_RELEASE_REF
ARG VITE_RELEASE_REPOSITORY=""
ARG RELEASE_CHANNEL
ENV VITE_RELEASE_REPOSITORY=$VITE_RELEASE_REPOSITORY
ENV VITE_RELEASE_REF=$VITE_RELEASE_REF
ENV VITE_RELEASE_CHANNEL=$RELEASE_CHANNEL
COPY web/management/package.json web/management/bun.lock ./
RUN bun install --frozen-lockfile
COPY web/management/ ./
RUN bun run build

FROM golang:1.27.3-bookworm@sha256:d9b6a1beb9474adc2a1ce842573639b44b2a0dd49b6669f51d3821baf9ec37c9 AS backend
WORKDIR /src
ARG VERSION
ARG COMMIT
ARG SOURCE_REPOSITORY
ARG RELEASE_CHANNEL
COPY go.mod go.sum ./
COPY third_party/yamux ./third_party/yamux
RUN go mod download
COPY . .
RUN go build -trimpath -ldflags "-s -w -X p2pstream/internal/buildinfo.Version=${VERSION} -X p2pstream/internal/buildinfo.Commit=${COMMIT} -X p2pstream/internal/buildinfo.Repository=${SOURCE_REPOSITORY} -X p2pstream/internal/buildinfo.Channel=${RELEASE_CHANNEL}" -o /out/p2pstream main.go

FROM scratch AS binary
COPY --from=backend /out/p2pstream /p2pstream

FROM golang:1.27.3-bookworm@sha256:d9b6a1beb9474adc2a1ce842573639b44b2a0dd49b6669f51d3821baf9ec37c9 AS test-base
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        bash \
        ca-certificates \
        curl \
        git \
        make \
        sqlite3 \
        unzip \
    && rm -rf /var/lib/apt/lists/*
# Reuse the verified Bun image rather than executing a network installer.
COPY --from=bun /usr/local/bin/bun /usr/local/bin/bun
RUN ln -s bun /usr/local/bin/bunx
WORKDIR /src
COPY go.mod go.sum ./
COPY third_party/yamux ./third_party/yamux
RUN go mod download
COPY web/management/package.json web/management/bun.lock ./web/management/
RUN cd web/management && bun install --frozen-lockfile
COPY . .

FROM test-base AS test
RUN make generate
RUN go test ./...
RUN cd third_party/yamux && go test ./...
RUN cd web/management && bun run typecheck
RUN make build

FROM test-base AS race-test
RUN make generate
RUN go test -race ./...
RUN cd third_party/yamux && go test ./... && go test -race -short ./...

FROM test-base AS smoke

FROM golang:1.27.3-bookworm@sha256:d9b6a1beb9474adc2a1ce842573639b44b2a0dd49b6669f51d3821baf9ec37c9 AS smoke-upstream-build
WORKDIR /src
COPY go.mod go.sum ./
COPY third_party/yamux ./third_party/yamux
RUN go mod download
COPY internal/smoketest/upstream ./internal/smoketest/upstream
RUN CGO_ENABLED=0 go build -trimpath -o /out/smoke-upstream ./internal/smoketest/upstream

FROM scratch AS smoke-upstream
COPY --from=smoke-upstream-build /out/smoke-upstream /smoke-upstream
EXPOSE 9000
CMD ["/smoke-upstream"]

FROM test-base AS legal
RUN make legal-notices

FROM debian:bookworm-slim@sha256:7ff6ba31527b9e336162fa061746c366c4b2032f4d2cff2078bea43f78efe3f8 AS runtime
WORKDIR /app
ARG VERSION
ARG COMMIT
ARG SOURCE_REPOSITORY
LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" \
      org.opencontainers.image.source="https://github.com/${SOURCE_REPOSITORY}" \
      org.opencontainers.image.revision="${COMMIT}" \
      org.opencontainers.image.version="${VERSION}"
RUN apt-get update \
    && apt-get install -y --no-install-recommends ca-certificates libcap2-bin \
    && rm -rf /var/lib/apt/lists/*
COPY --from=backend /out/p2pstream /app/p2pstream
COPY --from=frontend /app/web/management/dist /app/web/management/dist
COPY --from=legal /src/dist/legal /app/legal

RUN groupadd --system p2pstream \
    && useradd --system --gid p2pstream --home-dir /nonexistent --no-create-home --shell /usr/sbin/nologin p2pstream \
    && mkdir -p /data \
    && chown -R p2pstream:p2pstream /app /data \
    && setcap 'cap_net_bind_service=+ep' /app/p2pstream

USER p2pstream:p2pstream

ENV ENV=production
ENV MANAGEMENT_UI_DIST_DIR=/app/web/management/dist
ENV MANAGEMENT_PORT=8081
ENV CONFIG_DIR=/data

VOLUME /data
EXPOSE 80 443 8081
CMD ["/app/p2pstream", "server"]