Newer
Older
FROM node:20-alpine AS base
# to be able to read git hash
RUN apk -U upgrade && apk add --no-cache git openssh
RUN git config --global --add safe.directory /home/node/app
FROM base as dev_dep
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# --- dependencies ---
COPY --chown=node:node package*.json ./
COPY --chown=node:node packages/admin/package*.json ./packages/admin/
COPY --chown=node:node packages/client/package*.json ./packages/client/
COPY --chown=node:node packages/lib/package*.json ./packages/lib/
COPY --chown=node:node packages/server/package*.json ./packages/server/
USER node
RUN npm install --include=dev
FROM base as dep
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# --- dependencies ---
COPY --chown=node:node package*.json ./
COPY --chown=node:node packages/admin/package*.json ./packages/admin/
COPY --chown=node:node packages/client/package*.json ./packages/client/
COPY --chown=node:node packages/lib/package*.json ./packages/lib/
COPY --chown=node:node packages/server/package*.json ./packages/server/
USER node
RUN npm install --omit=dev
#
# === BUILDER ===
#
FROM base as build
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
# CLIENT_SENTRY_DSN will be baked into the client package
# SERVER_SENTRY_DSN is NOT baked in and must also be supplied to image on start
# SENTRY_{URL,ORG,PROJECT,AUTH_TOKEN} are used for sourcemap pushing
ARG CLIENT_SENTRY_DSN
ARG CLIENT_SENTRY_PROJECT
ARG SERVER_SENTRY_DSN
ARG SERVER_SENTRY_PROJECT
ARG SENTRY_URL
ARG SENTRY_ORG
ARG SENTRY_AUTH_TOKEN
COPY --chown=node:node . .
# --- build lib ---
RUN npm -w packages/lib run build
# janky? fix to keep imports in dev
RUN sed -i -e 's/"main": ".*"/"main": ".\/dist\/index.js"/' packages/lib/package.json
# --- build main client ---
ARG SENTRY_DSN=$CLIENT_SENTRY_DSN
ARG SENTRY_PROJECT=$CLIENT_SENTRY_PROJECT
RUN npm -w packages/client run build
# --- build admin ---
RUN npm -w packages/admin run build
# --- build server ---
RUN npx -w packages/server prisma generate
ARG SENTRY_DSN=$SERVER_SENTRY_DSN
ARG SENTRY_PROJECT=$SERVER_SENTRY_PROJECT
RUN npm -w packages/server run build
RUN if [ -n "$SENTRY_AUTH_TOKEN" ]; then npm -w packages/server run sentry; fi
#
# === RUNNER ===
#
FROM base as run
WORKDIR /home/node/app
COPY --from=dep /home/node/app/ ./
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# --- prepare lib ---
RUN mkdir -p packages/lib
COPY --from=build /home/node/app/packages/lib/package.json ./packages/lib
COPY --from=build /home/node/app/packages/lib/dist ./packages/lib/dist
# --- prepare client ---
RUN mkdir -p packages/client
COPY --from=build /home/node/app/packages/client/dist ./packages/client/
# --- prepare admin ---
RUN mkdir -p packages/admin
COPY --from=build /home/node/app/packages/admin/dist ./packages/admin/
# --- prepare server ---
RUN mkdir -p packages/server
COPY --from=build /home/node/app/packages/server/package.json ./packages/server/
COPY --from=build /home/node/app/packages/server/prisma ./packages/server/prisma
COPY --from=build /home/node/app/packages/server/tool.sh ./packages/server/
COPY --from=build /home/node/app/packages/server/dist ./packages/server/dist
# --- finalize ---
RUN npx -w packages/server prisma generate
# set runtime env variables
ENV PORT 3000
ENV NODE_ENV production
ENV SERVE_CLIENT /home/node/app/packages/client
ENV SERVE_ADMIN /home/node/app/packages/admin
ENV PIXEL_LOG_PATH /home/node/app/pixel.log
VOLUME /home/node/app/pixel.log
EXPOSE 3000
# profiler port, only used if profiler is explicity running
EXPOSE 9229
ENTRYPOINT [ "/bin/sh" ]
CMD [ "./docker-start.sh" ]