diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 15229c2..79803e6 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -1,4 +1,4 @@ -name: CI/CD Docker Build/Publish +name: Docker on: push: @@ -19,6 +19,7 @@ on: jobs: build-and-publish-image: runs-on: ubuntu-latest + timeout-minutes: 30 steps: - name: Checkout uses: actions/checkout@v4 @@ -55,12 +56,12 @@ jobs: # Build image and only publish if not a Pull Request - name: Build and Publish Docker Image uses: docker/build-push-action@v5 + timeout-minutes: 30 with: context: . push: ${{ github.event_name != 'pull_request' }} - target: release cache-from: type=gha cache-to: type=gha,mode=max - platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6 + platforms: linux/amd64,linux/arm64 tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} \ No newline at end of file + labels: ${{ steps.meta.outputs.labels }} diff --git a/Dockerfile b/Dockerfile index 4336037..855bc93 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,18 +1,22 @@ +# syntax=docker/dockerfile:1 -ARG NODE_VERSION=20.0.0 - -FROM node:${NODE_VERSION}-alpine +FROM node:20-alpine +# Use production node environment by default. ENV NODE_ENV production WORKDIR /app - +# Download dependencies as a separate step to take advantage of Docker's caching. +# Leverage a cache mount to /root/.npm to speed up subsequent builds. +# Leverage a bind mounts to package.json and package-lock.json to avoid having to copy them into +# into this layer. RUN --mount=type=bind,source=package.json,target=package.json \ -    --mount=type=bind,source=package-lock.json,target=package-lock.json \ -    --mount=type=cache,target=/root/.npm + --mount=type=bind,source=package-lock.json,target=package-lock.json \ + --mount=type=cache,target=/root/.npm \ + npm ci --omit=dev -# Run the application as a root user. +# Run the application as a non-root user. USER root # Copy the rest of the source files into the image. @@ -23,4 +27,3 @@ EXPOSE 8000 # Run the application. CMD node app.js -