diff --git a/.dockerignore b/.dockerignore index c998388d..72e9aa42 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,7 @@ -* -!.next/ -!public/ \ No newline at end of file +Dockerfile +.dockerignore +node_modules +npm-debug.log +README.md +.next +.git \ No newline at end of file diff --git a/.github/workflows/build-push-image.yml b/.github/workflows/build-push-image.yml index 4bf20313..1c44378a 100644 --- a/.github/workflows/build-push-image.yml +++ b/.github/workflows/build-push-image.yml @@ -16,22 +16,6 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 - - name: Set up pnpm - uses: pnpm/action-setup@v2.4.0 - with: - version: 8.12.1 - - name: Set up Node - uses: actions/setup-node@v4 - with: - node-version: '20.10.0' - cache: pnpm - cache-dependency-path: 'pnpm-lock.yaml' - - name: Froze lockfile - run: pnpm install --frozen-lockfile - working-directory: . - - name: Run pnpm build - run: | - pnpm build - name: Login to DockerHub uses: docker/login-action@v3 with: @@ -41,7 +25,6 @@ jobs: id: docker_build uses: docker/build-push-action@v5 with: - context: . file: Dockerfile platforms: linux/arm64 push: true diff --git a/Dockerfile b/Dockerfile index 34cf3630..0d595343 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,67 @@ -FROM mhart/alpine-node:slim-14 AS runner -WORKDIR /home/app -ENV NEXT_TELEMETRY_DISABLED 1 -COPY .next/standalone ./standalone -COPY public /home/app/standalone/public -COPY .next/static /home/app/standalone/.next/static - -EXPOSE 80 -ENV PORT 80 -CMD ["node", "./standalone/server.js"] \ No newline at end of file +FROM node:18-alpine AS base + +# 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 yarn global add pnpm && pnpm i --frozen-lockfile; \ + else echo "Lockfile not found." && exit 1; \ + fi + + +# Rebuild the source code only when needed +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# Next.js collects completely anonymous telemetry data about general usage. +# Learn more here: https://nextjs.org/telemetry +# Uncomment the following line in case you want to disable telemetry during the build. +# ENV NEXT_TELEMETRY_DISABLED 1 + +RUN yarn build + +# If using npm comment out above and use below instead +# RUN npm run build + +# Production image, copy all the files and run next +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV production +# Uncomment the following line in case you want to disable telemetry during runtime. +# ENV NEXT_TELEMETRY_DISABLED 1 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public + +# Set the correct permission for prerender cache +RUN mkdir .next +RUN chown nextjs:nodejs .next + +# 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 3000 + +ENV PORT 3000 +# set hostname to localhost +ENV HOSTNAME "0.0.0.0" + +# server.js is created by next build from the standalone output +# https://nextjs.org/docs/pages/api-reference/next-config-js/output +CMD ["node", "server.js"] \ No newline at end of file