aboutsummaryrefslogtreecommitdiffstats
path: root/docker/Dockerfile
diff options
context:
space:
mode:
authorMohamedBassem <me@mbassem.com>2024-07-28 00:06:36 +0000
committerMohamedBassem <me@mbassem.com>2024-07-28 00:06:50 +0000
commitc72dbd04e7b148120af721da27cd5ddd1b4eae82 (patch)
tree89ab2416b4dd31259940f6d77bb0c5185731ab56 /docker/Dockerfile
parentb74bee82baada515bcd0e4401d8ba12225e0f7a9 (diff)
downloadkarakeep-c72dbd04e7b148120af721da27cd5ddd1b4eae82.tar.zst
docker: Change all images to be built from the same AIO base
Diffstat (limited to 'docker/Dockerfile')
-rw-r--r--docker/Dockerfile152
1 files changed, 69 insertions, 83 deletions
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 592c4cfd..ed8d51ca 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -20,90 +20,110 @@ RUN cd packages/db && \
cp -R drizzle /db_migrations
-################# The Web builder ##############
+# Compile the web app
+RUN (cd apps/web && pnpm next experimental-compile)
-# Rebuild the source code only when needed
-FROM base AS web_builder
+# Build the worker code
+RUN --mount=type=cache,id=pnpm_workers,target=/pnpm/store pnpm deploy --node-linker=isolated --filter @hoarder/workers --prod /prod/workers
-WORKDIR /app/apps/web
+# Build the cli
+RUN (cd apps/cli && pnpm build)
-RUN pnpm next experimental-compile
+################# The All-in-one builder ##############
-################# The Web App ##############
-
-FROM node:21-alpine AS web
+FROM node:21-alpine AS aio_builder
WORKDIR /app
-ENV NODE_ENV production
-ENV NEXT_TELEMETRY_DISABLED 1
-
-COPY --from=web_builder --chown=node:node /app/apps/web/.next/standalone ./
-COPY --from=web_builder /app/apps/web/public ./apps/web/public
-COPY --from=web_builder /db_migrations /db_migrations
-
-# Set the correct permission for prerender cache
-RUN mkdir -p ./apps/web/.next
-RUN chown node:node ./apps/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/apps/web/.next/static ./apps/web/.next/static
+ARG SERVER_VERSION=nightly
+ENV SERVER_VERSION=${SERVER_VERSION}
-WORKDIR /app/apps/web
USER root
-EXPOSE 3000
ENV PORT 3000
-# set hostname to localhost
ENV HOSTNAME "0.0.0.0"
+EXPOSE 3000
-ARG SERVER_VERSION=nightly
-ENV SERVER_VERSION=${SERVER_VERSION}
+######################
+# Prepare s6-overlay
+######################
+ARG S6_OVERLAY_VERSION=3.2.0.0
+ARG TARGETARCH
-# server.js is created by next build from the standalone output
-# https://nextjs.org/docs/pages/api-reference/next-config-js/output
-CMD ["/bin/sh", "-c", "(cd /db_migrations && node index.js) && node server.js"]
+ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz /tmp
+RUN tar -C / -Jxpf /tmp/s6-overlay-noarch.tar.xz \
+ && case ${TARGETARCH} in \
+ "amd64") S6_ARCH=x86_64 ;; \
+ "arm64") S6_ARCH=aarch64 ;; \
+ esac \
+ && echo https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-${S6_ARCH}.tar.xz -O /tmp/s6-overlay-${S6_ARCH}.tar.xz \
+ && wget https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-${S6_ARCH}.tar.xz -O /tmp/s6-overlay-${S6_ARCH}.tar.xz \
+ && tar -C / -Jxpf /tmp/s6-overlay-${S6_ARCH}.tar.xz \
+ && rm -f /tmp/s6-overlay-${S6_ARCH}.tar.xz
-################# The workers builder ##############
+# Copy the s6-overlay config
+COPY --chmod=755 ./docker/root/etc/s6-overlay /etc/s6-overlay
-FROM base AS workers_builder
+######################
+# Install runtime deps
+######################
+RUN apk add --no-cache monolith
-RUN --mount=type=cache,id=pnpm_workers,target=/pnpm/store pnpm deploy --node-linker=isolated --filter @hoarder/workers --prod /prod
+######################
+# Prepare the web app
+######################
-################# The workers ##############
+ENV NODE_ENV production
+ENV NEXT_TELEMETRY_DISABLED 1
-FROM node:21-alpine AS workers
-WORKDIR /app
-RUN apk add --no-cache monolith
+COPY --from=base --chown=node:node /app/apps/web/.next/standalone ./
+COPY --from=base /app/apps/web/public ./apps/web/public
+COPY --from=base /db_migrations /db_migrations
+
+# Set the correct permission for prerender cache
+RUN mkdir -p ./apps/web/.next && chown node:node ./apps/web/.next
-COPY --from=workers_builder /prod apps/workers
+# Automatically leverage output traces to reduce image size
+# https://nextjs.org/docs/advanced-features/output-file-tracing
+COPY --from=base --chown=node:node /app/apps/web/.next/static ./apps/web/.next/static
+######################
+# Prepare the workers app
+######################
+COPY --from=base /prod/workers /app/apps/workers
RUN corepack enable
-WORKDIR /app/apps/workers
+ENTRYPOINT ["/init"]
-USER root
+################# The AIO ##############
-ARG SERVER_VERSION=nightly
-ENV SERVER_VERSION=${SERVER_VERSION}
+FROM aio_builder AS aio
-CMD ["pnpm", "run", "start:prod"]
+RUN touch /etc/s6-overlay/s6-rc.d/user/contents.d/init-db-migration \
+ /etc/s6-overlay/s6-rc.d/user/contents.d/svc-web \
+ /etc/s6-overlay/s6-rc.d/user/contents.d/svc-workers
-################# The cli builder ##############
+################# The web container ##############
-FROM base AS cli_builder
+FROM aio_builder AS web
-WORKDIR /app/apps/cli
+RUN touch /etc/s6-overlay/s6-rc.d/user/contents.d/init-db-migration \
+ /etc/s6-overlay/s6-rc.d/user/contents.d/svc-web
+
+################# The workers container ##############
-RUN pnpm run build
+FROM aio_builder AS workers
+
+# In the current implemtation, the workers assume the migration
+# is done for them.
+RUN rm /etc/s6-overlay/s6-rc.d/svc-workers/dependencies.d/init-db-migration \
+ && touch /etc/s6-overlay/s6-rc.d/user/contents.d/svc-workers
################# The cli ##############
FROM node:21-alpine AS cli
WORKDIR /app
-
-COPY --from=cli_builder /app/apps/cli/dist/index.mjs apps/cli/index.mjs
+COPY --from=base /app/apps/cli/dist/index.mjs apps/cli/index.mjs
WORKDIR /app/apps/cli
@@ -111,37 +131,3 @@ ARG SERVER_VERSION=nightly
ENV SERVER_VERSION=${SERVER_VERSION}
ENTRYPOINT ["node", "index.mjs"]
-
-
-################# All-in-one ##############
-
-# Start from the web container as its the one with the most configuration
-FROM web AS aio
-
-WORKDIR /app
-
-ARG S6_OVERLAY_VERSION=3.2.0.0
-ARG TARGETARCH
-
-# Install s6-overlay
-ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz /tmp
-RUN tar -C / -Jxpf /tmp/s6-overlay-noarch.tar.xz
-RUN case ${TARGETARCH} in \
- "amd64") S6_ARCH=x86_64 ;; \
- "arm64") S6_ARCH=aarch64 ;; \
- esac \
- && echo https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-${S6_ARCH}.tar.xz -O /tmp/s6-overlay-${S6_ARCH}.tar.xz \
- && wget https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-${S6_ARCH}.tar.xz -O /tmp/s6-overlay-${S6_ARCH}.tar.xz \
- && tar -C / -Jxpf /tmp/s6-overlay-${S6_ARCH}.tar.xz \
- && rm -f /tmp/s6-overlay-${S6_ARCH}.tar.xz
-
-# Install runtime deps
-RUN apk add --no-cache monolith
-
-# Copy workers code
-COPY --from=workers_builder /prod /app/apps/workers
-RUN corepack enable
-
-COPY --chmod=755 ./docker/root/etc/s6-overlay /etc/s6-overlay
-
-ENTRYPOINT ["/init"]