1- # ===============================================
2- FROM registry.access.redhat.com/ubi9/nodejs-22 AS appbase
3- # ===============================================
4- # install yarn
5- USER root
6- RUN curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | tee /etc/yum.repos.d/yarn.repo
7- RUN yum -y install yarn
8-
1+ # ============================================================
2+ # STAGE 1: Build the Static Assets
3+ # ============================================================
4+ FROM helsinki.azurecr.io/ubi9/nodejs-24-pnpm-builder-base AS appbase
95WORKDIR /app
106
11- # Offical image has npm log verbosity as info. More info - https://github.com/nodejs/docker-node#verbosity
12- ENV NPM_CONFIG_LOGLEVEL warn
13-
14- # set our node environment, either development or production
15- # defaults to production, compose overrides this to development on build and run
16- ARG NODE_ENV=production
17- ENV NODE_ENV $NODE_ENV
18-
19- # Global npm deps in a non-root user directory
20- ENV NPM_CONFIG_PREFIX=/app/.npm-global
21- ENV PATH=$PATH:/app/.npm-global/bin
22-
23- # Yarn
24- ENV YARN_VERSION 1.22.22
25- RUN yarn policies set-version ${YARN_VERSION}
7+ # 1. Copy needed files for build
8+ COPY --chown=default:root package.json pnpm-lock.yaml pnpm-workspace.yaml tsconfig.json tsconfig.node.json ./
9+ COPY --chown=default:root ./public ./public
2610
27- # Copy package.json and package-lock.json/yarn.lock files
28- COPY --chown=root:root package*.json *yarn* ./
11+ # 2. Run the install
12+ # corepack in the base image will automatically use the version of pnpm
13+ # defined in your package.json 'packageManager' field if present.
14+ RUN pnpm install --frozen-lockfile --ignore-scripts && pnpm store prune
2915
30- # Install npm depepndencies
31- ENV PATH /app/node_modules/.bin:$PATH
16+ # 3. Copy remaining source files
17+ COPY --chown=default:root index.html vite.config.ts eslint.config.js .prettierrc.json .env* ./
18+ COPY --chown=default:root ./src ./src
3219
33- RUN yarn install --frozen-lockfile --ignore-scripts && yarn cache clean --force
3420
35- # =============================
21+ # ============================================================
22+ # STAGE 2: Development
23+ # ============================================================
3624FROM appbase AS development
37- # =============================
25+ WORKDIR /app
3826
3927# Set NODE_ENV to development in the development container
4028ARG NODE_ENV=development
@@ -47,83 +35,76 @@ ENV NODE_ENV $NODE_ENV
4735ARG CHOKIDAR_USEPOLLING=true
4836ENV CHOKIDAR_USEPOLLING=${CHOKIDAR_USEPOLLING}
4937
50- # copy in our source code last, as it changes the most
51- COPY --chown=root:root . .
38+ # Expose port and start development server
39+ EXPOSE 8080
40+ CMD pnpm exec vite --port 8080 --no-open --host
5241
53- # Bake package.json start command into the image
54- CMD ["yarn" , "start" , "--no-open" , "--host" ]
5542
56- # ===================================
43+ # ============================================================
44+ # STAGE 3: Static builder for production
45+ # ============================================================
5746FROM appbase AS staticbuilder
58- # ===================================
5947
48+ # Accept Vite build-time variables from CI/CD docker --build-arg values.
49+ ARG VITE_ENVIRONMENT
6050ARG VITE_ORIGIN
61- ARG VITE_ADMIN_TICKET_VALIDATION_URL
6251ARG VITE_API_URI
6352ARG VITE_CMS_URI
64- ARG VITE_ENVIRONMENT
65- ARG VITE_OIDC_SERVER_TYPE
66- ARG VITE_OIDC_RETURN_TYPE
53+ ARG VITE_APPLICATION_NAME
54+ ARG VITE_VERSION
55+ ARG VITE_ELIGIBLE_CITIES
6756ARG VITE_OIDC_AUTHORITY
6857ARG VITE_OIDC_CLIENT_ID
6958ARG VITE_OIDC_KUKKUU_API_CLIENT_ID
7059ARG VITE_OIDC_SCOPE
60+ ARG VITE_OIDC_RETURN_TYPE
61+ ARG VITE_OIDC_SERVER_TYPE
62+ ARG VITE_OIDC_AUDIENCES
7163ARG VITE_OIDC_AUTOMATIC_SILENT_RENEW_ENABLED
7264ARG VITE_OIDC_SESSION_POLLING_INTERVAL_MS
73- ARG VITE_OIDC_AUDIENCES
74- ARG VITE_FEATURE_FLAG_SHOW_CORONAVIRUS_INFO
75- ARG VITE_SENTRY_ENVIRONMENT
76- ARG VITE_SENTRY_DSN
77- ARG VITE_SENTRY_TRACES_SAMPLE_RATE
78- ARG VITE_SENTRY_TRACE_PROPAGATION_TARGETS
79- ARG VITE_SENTRY_REPLAYS_SESSION_SAMPLE_RATE
80- ARG VITE_SENTRY_REPLAYS_ON_ERROR_SAMPLE_RATE
81- ARG VITE_CSP_REPORT_URI
82- ARG VITE_BUILDTIME
83- ARG VITE_SENTRY_RELEASE
84- ARG VITE_COMMITHASH
65+ ARG VITE_IDLE_TIMEOUT_IN_MS
8566ARG VITE_HELSINKI_PROFILE_URL
8667ARG VITE_MATOMO_URL_BASE
8768ARG VITE_MATOMO_SITE_ID
8869ARG VITE_MATOMO_SRC_URL
89- ARG VITE_MATOMO_TRACKER_URL
9070ARG VITE_MATOMO_ENABLED
91- ARG VITE_IDLE_TIMEOUT_IN_MS
71+ ARG VITE_APOLLO_PERSISTED_CACHE_TIME_TO_LIVE_MS
9272ARG VITE_ENROLMENT_CANCELLATION_TIME_LIMIT_HOURS
73+ ARG VITE_FEATURE_FLAG_SHOW_CORONAVIRUS_INFO
74+ ARG VITE_ADMIN_TICKET_VALIDATION_URL
75+ ARG VITE_SENTRY_DSN
76+ ARG VITE_SENTRY_ENVIRONMENT
77+ ARG VITE_SENTRY_RELEASE
78+ ARG VITE_SENTRY_TRACES_SAMPLE_RATE
79+ ARG VITE_SENTRY_TRACE_PROPAGATION_TARGETS
80+ ARG VITE_SENTRY_REPLAYS_SESSION_SAMPLE_RATE
81+ ARG VITE_SENTRY_REPLAYS_ON_ERROR_SAMPLE_RATE
9382
94- # Use template and inject the environment variables into .prod/nginx.conf
95- ENV VITE_CSP_REPORT_URI=${VITE_CSP_REPORT_URI:-"" }
96- ENV VITE_BUILDTIME=${VITE_BUILDTIME:-"" }
97- ENV VITE_RELEASE=${VITE_SENTRY_RELEASE:-"" }
98- ENV VITE_COMMITHASH=${VITE_COMMITHASH:-"" }
99- COPY .prod/nginx.conf.template /tmp/.prod/nginx.conf.template
100- RUN export APP_VERSION=$(yarn --silent app:version) && \
101- envsubst '${APP_VERSION},${VITE_BUILDTIME},${VITE_RELEASE},${VITE_COMMITHASH}' < \
102- "/tmp/.prod/nginx.conf.template" > \
103- "/tmp/.prod/nginx.conf"
104-
105- COPY . /app
106- RUN yarn build
107-
108- # =============================
109- FROM registry.access.redhat.com/ubi9/nginx-122 AS production
110- # =============================
111- # Add application sources to a directory that the assemble script expects them
112- # and set permissions so that the container runs without root access
113- USER root
114-
115- RUN chgrp -R 0 /usr/share/nginx/html && \
116- chmod -R g=u /usr/share/nginx/html
117-
118- # Copy static build
83+ # Perform the build
84+ ARG REACT_APP_SENTRY_RELEASE
85+ RUN pnpm build
86+
87+
88+ # ============================================================
89+ # STAGE 4: Production Runtime
90+ # ============================================================
91+ FROM helsinki.azurecr.io/ubi10/nginx-126-spa-standard AS production
92+
93+ ARG REACT_APP_SENTRY_RELEASE
94+ ENV APP_RELEASE=${REACT_APP_SENTRY_RELEASE:-"" }
95+ # 1. Copy the compiled assets
11996COPY --from=staticbuilder /app/build /usr/share/nginx/html
120- # Copy nginx config
121- COPY --from=staticbuilder /tmp/.prod/nginx.conf /etc/nginx/nginx.conf
12297
123- USER 1001
98+ # 2. Setup Runtime Env Injection
99+ # env.sh is provided by the base image
100+ WORKDIR /usr/share/nginx/html
101+ COPY .env .
124102
125- # Run script uses standard ways to run the application
126- CMD [ "/bin/bash" , "-c" , "nginx -g \" daemon off; \" " ]
103+ # 3. Inject Versioning for the /readiness endpoint from package.json using base image
104+ COPY package.json .
127105
128- EXPOSE 8080
106+ # - env.sh (Inherited from base image at /usr/share/nginx/html/env.sh)
107+ # - USER 1001 (Inherited from base image)
108+ # - EXPOSE 8080 (Inherited from base image)
109+ # - ENTRYPOINT/CMD (Inherited from base image)
129110
0 commit comments