From dabe3e7f3ca9952d8a7d207403913d3ce76bbed8 Mon Sep 17 00:00:00 2001 From: Max Leiter Date: Mon, 7 Mar 2022 20:42:44 -0800 Subject: [PATCH] WIP dockerfiles --- client/.dockerignore | 1 + client/Dockerfile | 56 ++++++++++++++++++++++++++++++++++++++ client/next.config.js | 3 ++ client/pages/post/[id].tsx | 6 ++-- server/.dockerignore | 1 + server/.gitignore | 3 +- server/Dockerfile | 38 ++++++++++++++++++++++++++ server/package.json | 3 +- server/tsconfig.json | 3 +- 9 files changed, 108 insertions(+), 6 deletions(-) create mode 100644 client/.dockerignore create mode 100644 client/Dockerfile create mode 100644 server/.dockerignore create mode 100644 server/Dockerfile diff --git a/client/.dockerignore b/client/.dockerignore new file mode 100644 index 00000000..40b878db --- /dev/null +++ b/client/.dockerignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/client/Dockerfile b/client/Dockerfile new file mode 100644 index 00000000..5df360e7 --- /dev/null +++ b/client/Dockerfile @@ -0,0 +1,56 @@ +# Install dependencies only when needed +FROM node:16-alpine AS deps +# 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 package.json yarn.lock ./ +RUN yarn install --frozen-lockfile + +# If using npm with a `package-lock.json` comment out above and use below instead +# COPY package.json package-lock.json ./ +# RUN npm ci + +# Rebuild the source code only when needed +FROM node:16-alpine AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# Next.js collects completely anonymous telemetry data about general usage. +# Learn more here: https://nextjs.org/telemetry +# Uncomment the following line in case you want to disable telemetry during the build. +ENV NEXT_TELEMETRY_DISABLED 1 + +RUN yarn build + +# If using npm comment out above and use below instead +# RUN npm run build + +# Production image, copy all the files and run next +FROM node:16-alpine AS runner +WORKDIR /app + +ENV NODE_ENV production + +ENV NEXT_TELEMETRY_DISABLED 1 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +# You only need to copy next.config.js if you are NOT using the default configuration +COPY --from=builder /app/next.config.js ./ +COPY --from=builder /app/public ./public +COPY --from=builder /app/package.json ./package.json + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3001 + +ENV PORT 3001 + +CMD ["node", "server.js"] diff --git a/client/next.config.js b/client/next.config.js index 8de8d48a..ba7bb8b1 100644 --- a/client/next.config.js +++ b/client/next.config.js @@ -1,6 +1,9 @@ /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, + experimental: { + outputStandalone: true, + }, async rewrites() { return [ { diff --git a/client/pages/post/[id].tsx b/client/pages/post/[id].tsx index 6f9457d6..b127e66f 100644 --- a/client/pages/post/[id].tsx +++ b/client/pages/post/[id].tsx @@ -1,5 +1,5 @@ -import { Loading, Text } from "@geist-ui/core"; -import Page from '../../components/page/Page' +import { Loading, Page, Text } from "@geist-ui/core"; + import { useRouter } from "next/router"; import { useCallback, useEffect, useState } from "react"; import Document from '../../components/document' @@ -45,7 +45,7 @@ const Post = ({ theme, changeTheme }: ThemeProps) => { }, [router, router.query.id]) return ( - +
diff --git a/server/.dockerignore b/server/.dockerignore new file mode 100644 index 00000000..40b878db --- /dev/null +++ b/server/.dockerignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/server/.gitignore b/server/.gitignore index 13dfa363..cfbfa63b 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -1,2 +1,3 @@ .env -node_modules/ \ No newline at end of file +node_modules/ +dist/ \ No newline at end of file diff --git a/server/Dockerfile b/server/Dockerfile new file mode 100644 index 00000000..a61abac1 --- /dev/null +++ b/server/Dockerfile @@ -0,0 +1,38 @@ +# Install dependencies only when needed +FROM node:16-alpine AS deps +# 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 git +WORKDIR /app +COPY package.json yarn.lock tsconfig.json tslint.json ./ +RUN yarn install --frozen-lockfile + +# If using npm with a `package-lock.json` comment out above and use below instead +# COPY package.json package-lock.json ./ +# RUN npm ci + +# Rebuild the source code only when needed +FROM node:16-alpine AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +RUN yarn build + +FROM node:16-alpine AS runner +WORKDIR /app + +ENV NODE_ENV production + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 drift + +COPY --from=builder /app/dist ./dist +COPY --from=builder /app/node_modules ./node_modules + +USER drift + +EXPOSE 3000 + +ENV PORT 3000 + +CMD ["node", "dist/index.js"] diff --git a/server/package.json b/server/package.json index ef6a91b8..1a78e7cd 100644 --- a/server/package.json +++ b/server/package.json @@ -5,7 +5,8 @@ "main": "index.ts", "scripts": { "start": "ts-node index.ts", - "dev": "nodemon index.ts" + "dev": "nodemon index.ts", + "build": "tsc -p ." }, "author": "", "license": "ISC", diff --git a/server/tsconfig.json b/server/tsconfig.json index 1de870e1..e5fbe651 100644 --- a/server/tsconfig.json +++ b/server/tsconfig.json @@ -12,7 +12,8 @@ "pretty": true, "strictNullChecks": true, "skipLibCheck": true, - "strictPropertyInitialization": true + "strictPropertyInitialization": true, + "outDir": "dist" }, "include": ["lib/**/*.ts", "index.ts", "src/**/*.ts"], "exclude": ["node_modules"]