diff --git a/Dockerfile b/Dockerfile index 2014f87..5a275a0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,23 +1,38 @@ # https://dev.to/code42cate/how-to-dockerize-and-deploy-astro-6ll -FROM node:alpine AS base +# use the official Bun image +# see all versions at https://hub.docker.com/r/oven/bun/tags +FROM oven/bun:1-alpine AS base WORKDIR /app -COPY package.json package-lock.json ./ +# install dependencies into temp directory +# this will cache them and speed up future builds +FROM base AS install +RUN mkdir -p /temp/dev +COPY package.json bun.lock /temp/dev/ +RUN cd /temp/dev && bun install --frozen-lockfile -FROM base AS deps -RUN npm install +# install with --production (exclude devDependencies) +RUN mkdir -p /temp/prod +COPY package.json bun.lock /temp/prod/ +RUN cd /temp/prod && bun install --frozen-lockfile --production -FROM deps AS build +# copy node_modules from temp directory +# then copy all (non-ignored) project files into the image +FROM base AS prerelease +COPY --from=install /temp/dev/node_modules node_modules COPY . . -RUN npm run build -FROM base AS runtime -COPY --from=deps /app/node_modules ./node_modules -COPY --from=build /app/dist ./dist +# build +RUN bun run build -ENV HOST=0.0.0.0 -ENV PORT=3000 -EXPOSE 3000 +# copy production dependencies and source code into final image +FROM base AS release +COPY --from=install /temp/prod/node_modules node_modules +COPY --from=prerelease /app/index.ts . +COPY --from=prerelease /app/package.json . -CMD node ./dist/server/entry.mjs +# run the app +USER bun +EXPOSE 3000 +CMD bun run ./dist/server/entry.mjs \ No newline at end of file