# syntax=docker/dockerfile:1 ARG DOCKERHUB_MIRROR= ARG NODE_VERSION ARG ALPINE_VERSION ARG SWS_VERSION ARG REDOCLY_VERSION FROM ghcr.io/static-web-server/static-web-server:${SWS_VERSION} AS sws FROM ${DOCKERHUB_MIRROR}node:${NODE_VERSION} AS base WORKDIR /app COPY ui/package.json ui/package-lock.json ./ COPY ui/packages/design-system/package.json ./packages/design-system/ COPY ui/apps/console/package.json ./apps/console/ COPY ui/apps/website/package.json ./apps/website/ COPY ui/apps/docs/package.json ./apps/docs/ RUN --mount=type=cache,id=shellhub-npm,target=/root/.npm,sharing=shared \ npm install FROM base AS development RUN apk add --no-cache build-base python3 curl git gcompat COPY ui/scripts/install-vale.sh /tmp/install-vale RUN /tmp/install-vale /usr/local/bin && rm /tmp/install-vale WORKDIR /src COPY --from=base /app/node_modules /node_modules COPY ui/scripts /scripts CMD ["/scripts/entrypoint-dev.sh"] FROM ${DOCKERHUB_MIRROR}node:${NODE_VERSION} AS spec-bundler ARG REDOCLY_VERSION RUN --mount=type=cache,id=shellhub-npm,target=/root/.npm,sharing=shared \ npm install -g @redocly/cli@${REDOCLY_VERSION:?} WORKDIR /spec COPY openapi/spec ./spec COPY openapi/plugins ./plugins COPY openapi/redocly.yaml . RUN redocly bundle spec/openapi.yaml -o openapi.json FROM base AS builder WORKDIR /app COPY ui/. . COPY --from=spec-bundler /spec/openapi.json ./apps/console/openapi.json RUN OPENAPI_SPEC_PATH=./openapi.json npm run generate -w @shellhub/console RUN npm exec -w @shellhub/console -- vite build RUN apk add --no-cache brotli gzip && \ find apps/console/dist -type f -size +1024c \ \( -name '*.js' -o -name '*.css' -o -name '*.html' -o -name '*.json' \ -o -name '*.svg' -o -name '*.ico' \) \ ! -name 'config.json' \ -exec brotli -q 11 -k {} \; \ -exec gzip -9 -k {} \; FROM ${DOCKERHUB_MIRROR}alpine:${ALPINE_VERSION} AS production RUN apk upgrade --no-cache libssl3 libcrypto3 COPY --from=sws /static-web-server /usr/local/bin/static-web-server RUN addgroup -g 1000 -S shellhub && adduser -u 1000 -S -G shellhub shellhub COPY ui/sws.toml /etc/sws.toml COPY ui/scripts /scripts COPY --from=builder --chown=1000:1000 /app/apps/console/dist /var/www USER 1000:1000 EXPOSE 8080 CMD ["/scripts/entrypoint.sh"]