diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..665b4966 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +.git +.env +node_modules +dist +logs diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..b72d258e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,51 @@ +# syntax=docker/dockerfile:1 + +ARG app_dir="/home/node/app" + + +# * Base Node.js image +FROM node:20-alpine AS base +ARG app_dir +WORKDIR ${app_dir} + + +# * Installing production dependencies +FROM base AS dependencies + +RUN --mount=type=bind,source=package.json,target=package.json \ + --mount=type=bind,source=package-lock.json,target=package-lock.json \ + --mount=type=cache,target=/root/.npm \ + npm ci --omit=dev + + +# * Installing development dependencies and building the application +FROM base AS build + +RUN --mount=type=bind,source=package.json,target=package.json \ + --mount=type=bind,source=package-lock.json,target=package-lock.json \ + --mount=type=cache,target=/root/.npm \ + npm ci + +COPY . . +# TODO: re-enable after TypeScript migration +#RUN npm run build + + +# * Running the final application +FROM base AS final +ARG app_dir + +RUN mkdir -p ${app_dir}/logs && chown node:node ${app_dir}/logs + +ENV NODE_ENV=production +USER node + +COPY package.json . + +COPY --from=dependencies ${app_dir}/node_modules ${app_dir}/node_modules +COPY --from=build ${app_dir} ${app_dir} + +# TODO: change back after TypeScript migration +#COPY --from=build ${app_dir}/dist ${app_dir}/dist + +CMD ["node", "."]