aboutsummaryrefslogtreecommitdiffstats
path: root/docker/Dockerfile
diff options
context:
space:
mode:
authorMohamedBassem <me@mbassem.com>2024-02-20 21:23:28 +0000
committerMohamedBassem <me@mbassem.com>2024-02-20 21:38:14 +0000
commit8711bca9db49546d265fc119b5dcf3eb2db22095 (patch)
tree16bf6fd86da06a80014dfb5738e43a63af038793 /docker/Dockerfile
parentdbdde49c1e4870f402dc8901e0bf78abb790caf9 (diff)
downloadkarakeep-8711bca9db49546d265fc119b5dcf3eb2db22095.tar.zst
docker: Add a docker-based dev environment
Diffstat (limited to 'docker/Dockerfile')
-rw-r--r--docker/Dockerfile99
1 files changed, 99 insertions, 0 deletions
diff --git a/docker/Dockerfile b/docker/Dockerfile
new file mode 100644
index 00000000..0e587790
--- /dev/null
+++ b/docker/Dockerfile
@@ -0,0 +1,99 @@
+################# The Web App ##############
+
+# Rebuild the source code only when needed
+FROM node:21-alpine AS web_builder
+
+# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
+RUN apk add --no-cache libc6-compat
+
+WORKDIR /app
+COPY packages/db packages/db
+COPY packages/web packages/web
+COPY packages/shared packages/shared
+COPY package.json yarn.lock .yarnrc.yml .
+
+ENV NEXT_TELEMETRY_DISABLED 1
+
+RUN corepack enable && \
+ cd /app/packages/db && \
+ yarn dlx prisma generate && \
+ cd /app/packages/web/ && \
+ yarn install --immutable && \
+ yarn next experimental-compile
+
+FROM node:21-alpine AS web
+WORKDIR /app
+
+ENV NODE_ENV production
+ENV NEXT_TELEMETRY_DISABLED 1
+
+COPY --from=web_builder --chown=node:node /app/packages/web/.next/standalone ./
+COPY --from=web_builder /app/packages/web/public ./packages/web/public
+
+# Set the correct permission for prerender cache
+RUN mkdir -p ./package/web/.next
+RUN chown node:node ./packages/web/.next
+
+# Automatically leverage output traces to reduce image size
+# https://nextjs.org/docs/advanced-features/output-file-tracing
+COPY --from=web_builder --chown=node:node /app/packages/web/.next/static ./packages/web/.next/static
+
+WORKDIR /app/packages/web
+USER root
+EXPOSE 3000
+
+ENV PORT 3000
+# set hostname to localhost
+ENV HOSTNAME "0.0.0.0"
+
+# server.js is created by next build from the standalone output
+# https://nextjs.org/docs/pages/api-reference/next-config-js/output
+CMD ["node", "server.js"]
+
+################# The workers builder ##############
+
+FROM node:21-alpine AS workers_builder
+WORKDIR /app
+
+# Install chromium needed for puppeteer
+RUN apk add --no-cache make g++ py3-pip linux-headers
+
+COPY packages/db/package.json packages/db/package.json
+COPY packages/shared/package.json packages/shared/package.json
+COPY packages/workers/package.json packages/workers/package.json
+COPY package.json yarn.lock .yarnrc.yml .
+
+RUN corepack enable && \
+ cd /app/packages/workers && \
+ yarn workspaces focus --production && \
+ cd /app/packages/db && \
+ yarn dlx prisma generate
+
+
+################# The workers ##############
+
+FROM node:21-alpine AS workers
+WORKDIR /app
+
+# Install chromium needed for puppeteer
+RUN apk add --no-cache chromium runuser
+ENV PUPPETEER_SKIP_DOWNLOAD true
+ENV CHROME_PATH "/usr/bin/chromium-browser"
+ENV BROWSER_EXECUTABLE_PATH "/app/start-chrome.sh"
+ENV BROWSER_USER_DATA_DIR="/tmp/chrome"
+
+ADD docker/start-chrome.sh .
+RUN chmod +x /app/start-chrome.sh
+
+COPY packages/db packages/db
+COPY packages/shared packages/shared
+COPY packages/workers packages/workers
+COPY package.json yarn.lock .yarnrc.yml .
+COPY --from=workers_builder /app/node_modules /app/node_modules
+
+RUN corepack enable && cd packages/db && yarn dlx prisma generate
+
+WORKDIR /app/packages/workers
+USER root
+
+CMD ["yarn", "run", "start:prod"]