From 5c1b810da1ad7da276fa076bcd6ddf322026135b Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Mon, 12 Feb 2024 18:56:26 +0100 Subject: [PATCH 1/2] 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 From eca82edf4fc791a4ce7012446eea63939133b00b Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Mon, 12 Feb 2024 18:56:49 +0100 Subject: [PATCH 2/2] Updated just targets --- Justfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Justfile b/Justfile index 86fbfb5..5d3bc39 100644 --- a/Justfile +++ b/Justfile @@ -6,6 +6,7 @@ build-container-release: # Builds a release container and runs it start-release: build-container-release remove-podman-containers podman run -d -e DATABASE_URL=sqlite:release.db -p 8080:8080 --name ttime ttime-server + @echo "Started production ttime-server on http://localhost:8080" # Removes and stops any containers related to the project [private] @@ -14,7 +15,7 @@ remove-podman-containers: # Saves the release container to a tarball, pigz is just gzip but multithreaded save-release: build-container-release - podman save --format=oci-archive ttime-server | pigz -9 > ttime-server-pigz.tar.gz + podman save --format=oci-archive ttime-server | pigz -9 > ttime-server.tar.gz # Loads the release container from a tarball load-release file: @@ -25,5 +26,6 @@ clean: remove-podman-containers podman image rm -f ttime-server rm -rf frontend/dist rm -rf frontend/node_modules + rm ttime-server.tar.gz cd backend && make clean @echo "Cleaned up!" \ No newline at end of file