From dc6526659fc899e0665f870adfbfca5505c05058 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20S=C3=A1nchez-Gallego?= Date: Fri, 9 Aug 2024 13:43:58 -0700 Subject: [PATCH] Add docker workflow --- .dockerignore | 8 ++++++ .env.production | 1 + .github/workflows/docker.yml | 48 +++++++++++++++++++++++++++++++ .github/workflows/npm_test.yml | 27 ------------------ Dockerfile | 52 ++++++++++++++++++++++++++++++++++ next.config.mjs | 1 + 6 files changed, 110 insertions(+), 27 deletions(-) create mode 100644 .dockerignore create mode 100644 .env.production create mode 100644 .github/workflows/docker.yml delete mode 100644 .github/workflows/npm_test.yml create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..a9b314f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +**/node_modules/ +**/dist +.git +npm-debug.log +.coverage +.coverage.* +.env +.aws diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..46569bc --- /dev/null +++ b/.env.production @@ -0,0 +1 @@ +LVM_API_BASE_URL=http://localhost:8085 diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 0000000..e5a5d1f --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,48 @@ +name: Docker + +on: + push: + branches: + - main + tags: + - '*' + paths-ignore: + - 'docs/**' + +jobs: + docker: + runs-on: ubuntu-latest + env: + USER: sdss + APP: lvmweb + steps: + - name: Set docker tags + id: set-tags + run: | + if [[ $GITHUB_REF == refs/heads/main ]] + then + echo TAGS=$USER/$APP:latest >> $GITHUB_OUTPUT + elif [[ $GITHUB_REF == refs/heads/* ]] + then + BRANCH=$(echo ${GITHUB_REF#refs/heads/} | sed -r 's/[\/]/_/g') + echo TAGS=$USER/$APP:$BRANCH >> $GITHUB_OUTPUT + else + echo TAGS=$USER/$APP:${GITHUB_REF#refs/tags/} >> $GITHUB_OUTPUT + fi + - name: Show tags + run: echo ${{ steps.set-tags.outputs.TAGS }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Log in to registry + run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u $ --password-stdin + - name: Build and push + id: docker_build + uses: docker/build-push-action@v6 + with: + push: true + tags: ghcr.io/${{ steps.set-tags.outputs.TAGS }} + file: Dockerfile + - name: Image digest + run: echo ${{ steps.docker_build.outputs.digest }} diff --git a/.github/workflows/npm_test.yml b/.github/workflows/npm_test.yml deleted file mode 100644 index ab5e842..0000000 --- a/.github/workflows/npm_test.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: npm test - -on: - pull_request: - branches: - - '**' - -concurrency: - group: ${{ github.workflow }}-${{ github.event.number || github.sha }} - cancel-in-progress: true - -jobs: - test_pull_request: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version-file: '.nvmrc' - cache: 'yarn' - cache-dependency-path: '**/yarn.lock' - - name: Install dependencies - run: yarn - - name: Run build - run: npm run build - - name: Run tests - run: npm test diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f7dac41 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,52 @@ +FROM node:22-alpine AS base + +# 1. Install dependencies only when needed +FROM base AS deps +# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. +RUN apk add --no-cache libc6-compat + +WORKDIR /app + +# Install dependencies based on the preferred package manager +COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./ +RUN \ + if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ + elif [ -f package-lock.json ]; then npm ci; \ + elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i; \ + else echo "Lockfile not found." && exit 1; \ + fi + + +# 2. Rebuild the source code only when needed +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . +# This will do the trick, use the corresponding env file for each environment. +COPY .env.production .env.production +RUN npm run build + +# 3. Production image, copy all the files and run next +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV=production + +RUN addgroup -g 1001 -S nodejs +RUN adduser -S nextjs -u 1001 + +COPY --from=builder /app/public ./public + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + + +USER nextjs + +EXPOSE 3005 + +ENV PORT=3005 + +CMD HOSTNAME=localhost node server.js diff --git a/next.config.mjs b/next.config.mjs index 26882a5..0ffae04 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -18,6 +18,7 @@ export default withBundleAnalyzer({ }, trailingSlash: true, basePath: '/lvmweb2', + output: 'standalone', async redirects() { return [ {