From 5c1b810da1ad7da276fa076bcd6ddf322026135b Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Mon, 12 Feb 2024 18:56:26 +0100 Subject: [PATCH] Multi-stage container build for smaller image size --- container/Containerfile | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/container/Containerfile b/container/Containerfile index ac4f770..86f9184 100644 --- a/container/Containerfile +++ b/container/Containerfile @@ -2,26 +2,39 @@ # We use node:latest as the base image. # Essentially we build the frontend SPA with vite and # make it available in the public directory. -FROM docker.io/node:latest as client +FROM docker.io/node:alpine as client WORKDIR /build ADD frontend /build RUN npm install RUN npm run build # Builds the server in an isolated stage -FROM docker.io/golang:latest as go +FROM docker.io/golang:alpine as go +RUN apk add gcompat +RUN apk add gcc +RUN apk add musl-dev ADD backend /build WORKDIR /build -# Copy the frontend SPA build into public -COPY --from=client /build/dist /build/static - # Get the dependencies RUN go mod download # RUN go build -o server RUN CGO_ENABLED=1 GOOS=linux go build -a -installsuffix cgo -o ./server ./cmd/ +# The final stage for building a minimal image +FROM docker.io/alpine:latest as runner +WORKDIR /app + +# Copy the frontend SPA build into public +COPY --from=client /build/dist /app/static + +# Copy the server binary +COPY --from=go /build/server /app/server + +# Copy the migration scripts +COPY --from=go /build/migrations /app/migrations + # Expose port 8080 EXPOSE 8080