# Base builder FROM golang:1.21-alpine AS base WORKDIR /app RUN apk add --no-cache gcc musl-dev COPY go.mod go.sum ./ RUN go mod download COPY db/crsqlite.so ./db/ # Frontend builder FROM node:18-alpine AS frontend-builder WORKDIR /app COPY ./mast-react-vite/package.json ./mast-react-vite/package-lock.json ./ RUN npm install COPY ./mast-react-vite/src ./src COPY ./mast-react-vite/public ./public COPY ./mast-react-vite/index.html ./ COPY ./mast-react-vite/*.config.js ./mast-react-vite/*.config.ts ./ RUN npm run build # Server builder FROM base AS server-builder WORKDIR /app COPY server/main.go server/auth.go server/auth.db server/test.go ./server/ RUN CGO_ENABLED=1 go build -o /app/bin/server ./server/main.go ./server/auth.go # Frontend stage FROM nginx:alpine AS frontend COPY --from=frontend-builder /app/dist /usr/share/nginx/html RUN mkdir -p /usr/share/nginx/html/db COPY --from=base /app/db/crsqlite.so /usr/share/nginx/html/db/crsqlite.so EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] # Server stage FROM alpine:latest AS server WORKDIR /app RUN apk upgrade --no-cache RUN apk add --no-cache ca-certificates RUN apk add --no-cache libgcc # We need ../db/crsqlite.so because of silly relative imports in this container... COPY --from=server-builder /app/bin/server /app/bin/server COPY --from=base /app/db/ /app/db/ COPY --from=base /app/db/crsqlite.so /usr/share/nginx/html/db/crsqlite.so RUN mkdir -p /app/rooms EXPOSE 8080 WORKDIR /app/bin/ CMD ["/app/bin/server"]