# Dockerfile References: https://docs.docker.com/engine/reference/builder/ # This dockerfile uses a multi-stage build system to reduce the image footprint. ###### # Build frontend ###### FROM --platform=${BUILDPLATFORM} node:lts-alpine as frontend # Set the working directory WORKDIR /build # Download dependencies COPY frontend/package.json frontend/package-lock.json ./ RUN npm ci # Set dist output directory ENV DIST_OUT_DIR="dist" # Copy the sources to the working directory COPY frontend . # Build the frontend RUN npm run build ###### # Build backend ###### FROM --platform=${BUILDPLATFORM} golang:1.21-alpine as builder # Set the working directory WORKDIR /build # Download dependencies COPY go.mod go.sum ./ RUN go mod download # Copy the sources to the working directory COPY . . # Copy the frontend build result COPY --from=frontend /build/dist/ ./internal/app/api/core/frontend-dist/ # Set the build version from arguments ARG BUILD_VERSION # Split to cross-platform build ARG TARGETARCH # Build the application RUN CGO_ENABLED=0 GOARCH=${TARGETARCH} go build -o /build/dist/wg-portal \ -ldflags "-w -s -extldflags '-static' -X 'github.com/h44z/wg-portal/internal.Version=${BUILD_VERSION}'" \ -tags netgo \ cmd/wg-portal/main.go ###### # Final image ###### FROM alpine:3.19 # Install OS-level dependencies RUN apk add --no-cache bash curl iptables nftables openresolv # Setup timezone ENV TZ=Europe/Vienna # Copy binaries COPY --from=builder /build/dist/wg-portal /app/wg-portal # Set the Current Working Directory inside the container WORKDIR /app # by default, the web-portal is reachable on port 8888 EXPOSE 8888/tcp # the database and config file can be mounted from the host VOLUME [ "/app/data", "/app/config" ] # Command to run the executable ENTRYPOINT [ "/app/wg-portal" ]