Files
TheGame/docker/frontend/Dockerfile
2024-08-13 19:04:31 -04:00

147 lines
5.0 KiB
Docker

# syntax=docker/dockerfile:1
# This is not intended to be used for local development!
# For this file to build, it needs to have a `$TARGET` specified.
# Either `production` or `development` to run either the built
# site or dev environment respectively.
ARG TARGET=production
FROM node:20-slim AS base
WORKDIR /usr/src/app
# Install dependencies not included in the slim image
RUN apt update && apt install -y --no-install-recommends g++ make python3 git ca-certificates
# Install dependencies for dev and prod
COPY package.json ./
COPY lerna.json ./
COPY yarn.lock ./
COPY schema.graphql ./
COPY tsconfig.*json ./
COPY packages/web/*.json ./packages/web/
COPY packages/web/codegen.ts ./packages/web/
COPY packages/utils/*.json ./packages/utils/
COPY packages/design-system/*.json ./packages/design-system/
# Needed for an immutable `yarn install`
COPY packages/discord-bot/*.json ./packages/discord-bot/
COPY packages/backend/*.json ./packages/backend/
RUN corepack enable
RUN yarn config set nodeLinker node-modules
RUN yarn install --immutable
FROM base AS build
# Copy source files
COPY packages/web/ packages/web/
COPY packages/utils/ packages/utils/
COPY packages/design-system/ packages/design-system/
COPY packages/@types/ packages/@types/
# Build
FROM build AS build-production
# Each ENV below must have an ARG as well to be available at runtime
ARG APP_ENV
ARG GRAPHQL_URL=https://api.metagame.wtf/v1/graphql
ARG FRONTEND_URL=https://metagame.wtf
ARG IMGIX_TOKEN
ARG YOUTUBE_API_KEY
ARG HONEYBADGER_API_KEY
ARG GOOGLE_ANALYTICS_ID
ARG USERBACK_TOKEN
ARG CERAMIC_URL=https://ceramic.metagame.wtf
ARG WEB3_STORAGE_TOKEN
ARG OPENSEA_API_KEY
ARG GCAL_CALENDAR_ID
ARG GCAL_PRIVATE_KEY
ARG GCAL_CLIENT_EMAIL
ARG GCAL_PROJECT_NUMBER
ARG ALCHEMY_API_KEY
ARG WEB3_STORAGE_DID
ARG WEB3_STORAGE_KEY
ARG WEB3_STORAGE_PROOF
# ARGs are not available at runtime, so define ENV variables
# These ENVs should match the --set-env-vars in `.github/workflows/gcp-deploy.yaml`
# see https://www.saltycrane.com/blog/2021/04/buildtime-vs-runtime-environment-variables-nextjs-docker/
ENV NEXT_PUBLIC_APP_EN=$APP_ENV
ENV NEXT_PUBLIC_GRAPHQL_URL=$GRAPHQL_URL
ENV NEXT_PUBLIC_FRONTEND_URL=$FRONTEND_URL
ENV NEXT_PUBLIC_IMGIX_TOKEN=$IMGIX_TOKEN
ENV NEXT_PUBLIC_YOUTUBE_API_KEY=$YOUTUBE_API_KEY
ENV NEXT_PUBLIC_HONEYBADGER_API_KEY=$HONEYBADGER_API_KEY
ENV NEXT_PUBLIC_GOOGLE_ANALYTICS_ID=$GOOGLE_ANALYTICS_ID
ENV NEXT_PUBLIC_USERBACK_TOKEN=$USERBACK_TOKEN
ENV NEXT_PUBLIC_CERAMIC_URL=$CERAMIC_URL
ENV NEXT_PUBLIC_GCAL_CALENDAR_ID=$GCAL_CALENDAR_ID
ENV NEXT_PUBLIC_ALCHEMY_API_KEY=$ALCHEMY_API_KEY
ENV NEXT_PUBLIC_WEB3_STORAGE_DID=$WEB3_STORAGE_DID
ENV NEXT_PUBLIC_WEB3_STORAGE_KEY=$WEB3_STORAGE_KEY
ENV NEXT_PUBLIC_WEB3_STORAGE_PROOF=$WEB3_STORAGE_PROOF
# These are not exposed to the browser
ENV WEB3_STORAGE_TOKEN=$WEB3_STORAGE_TOKEN
ENV OPENSEA_API_KEY=$OPENSEA_API_KEY
ENV GCAL_PRIVATE_KEY=$GCAL_PRIVATE_KEY
ENV GCAL_CLIENT_EMAIL=$GCAL_CLIENT_EMAIL
ENV GCAL_PROJECT_NUMBER=$GCAL_PROJECT_NUMBER
ONBUILD RUN yarn web:build
FROM build AS build-development
ONBUILD RUN yarn web:deps:build
FROM "build-$TARGET" AS built
# New stage including only necessary files
FROM node:20-slim AS app
WORKDIR /app
# Copy necessary files into the stage
COPY --from=built /usr/src/app/package.json ./
# COPY --from=built /usr/src/app/node_modules/ ./
# Copy the built web app
FROM app AS copy-production
# ARG CACHEBUST
ONBUILD COPY --from=built /usr/src/app/packages/utils/package.json packages/utils/
ONBUILD COPY --from=built /usr/src/app/packages/utils/dist/ packages/utils/dist/
ONBUILD COPY --from=built /usr/src/app/packages/design-system/package.json packages/design-system/
ONBUILD COPY --from=built /usr/src/app/packages/design-system/dist/ packages/design-system/dist/
ONBUILD COPY --from=built /usr/src/app/packages/web/package.json packages/web/
# ONBUILD COPY --from=built /usr/src/app/packages/web/node_modules packages/web/
ONBUILD COPY --from=built /usr/src/app/packages/web/public/ packages/web/public/
ONBUILD COPY --from=built /usr/src/app/packages/web/.next/ packages/web/.next/
ONBUILD RUN apt update && apt install -y --no-install-recommends git ca-certificates
ONBUILD RUN corepack enable
ONBUILD RUN yarn config set nodeLinker node-modules
ONBUILD RUN yarn workspaces focus @metafam/web --production # --immutable
# ONBUILD RUN yarn install --pure-lockfile --production --ignore-scripts --prefer-offline
ONBUILD RUN ls -la packages/*/
ONBUILD CMD ["yarn", "web", "start"]
# Copy the sources
FROM app AS copy-development
ONBUILD COPY --from=built /usr/src/app/schema.graphql ./
ONBUILD COPY --from=built /usr/src/app/tsconfig*.json ./
ONBUILD COPY --from=built /usr/src/app/lerna.json ./
ONBUILD COPY --from=built /usr/src/app/packages/design-system/ packages/design-system/
ONBUILD COPY --from=built /usr/src/app/packages/utils/ packages/utils/
ONBUILD COPY --from=built /usr/src/app/packages/web/ packages/web/
ONBUILD RUN rm -rf packages/design-system/dist/
ONBUILD RUN rm -rf packages/web/.next/
ONBUILD CMD ["yarn", "web:dev"]
FROM "copy-$TARGET" AS final
RUN echo "Generated $TARGET image for frontend."