Skip to content

Commit 04ce02b

Browse files
committed
feat: 🎸 update Docker image to use best practices
1 parent 7da6b94 commit 04ce02b

File tree

6 files changed

+59
-31
lines changed

6 files changed

+59
-31
lines changed

‎.dockerignore‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
.github
44
# editor
55
.idea
6+
.vscode
67
# dependencies
78
node_modules
89
.pnp
@@ -34,4 +35,11 @@ cypress/screenshots
3435
cypress/videos
3536

3637
apps/**/styles/tailwind.css
37-
packages/**/styles/tailwind.css
38+
packages/**/styles/tailwind.css
39+
40+
.changeset
41+
examples
42+
CHANGESETS.md
43+
CONTRIBUTING.md
44+
README.md
45+
LICENSE

‎apps/webapp/package.json‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"@codemirror/view": "^6.5.0",
3737
"@conform-to/react": "^0.6.1",
3838
"@conform-to/zod": "^0.6.1",
39+
"@godaddy/terminus": "^4.12.1",
3940
"@headlessui/react": "^1.7.8",
4041
"@heroicons/react": "^2.0.12",
4142
"@highlight-run/node": "^3.1.0",
@@ -173,4 +174,4 @@
173174
"engines": {
174175
"node": ">=16.0.0"
175176
}
176-
}
177+
}

‎apps/webapp/server.ts‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import express from "express";
33
import compression from "compression";
44
import morgan from "morgan";
55
import { createRequestHandler } from "@remix-run/express";
6+
import { createTerminus } from "@godaddy/terminus";
67

78
const app = express();
89

@@ -56,12 +57,15 @@ app.all(
5657

5758
const port = process.env.REMIX_APP_PORT || 3000;
5859

59-
app.listen(port, () => {
60+
const server = app.listen(port, () => {
6061
// require the built app so we're ready when the first request comes in
6162
require(BUILD_DIR);
6263
console.log(`✅ app ready: http://localhost:${port}`);
6364
});
6465

66+
// Handle shutdowns gracefully
67+
createTerminus(server, { signals: ["SIGINT", "SIGTERM"], timeout: 5000 });
68+
6569
function purgeRequireCache() {
6670
// purge require cache on requests for "server side HMR" this won't let
6771
// you have in-memory objects between requests in development,

‎docker/Dockerfile‎

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
1-
FROM node:18 AS pruner
1+
FROM node:18.16.1-bullseye-slim AS pruner
22

33
WORKDIR /triggerdotdev
44

5-
COPY . .
5+
COPY --chown=node:node . .
66
RUN npx -q turbo prune --scope=webapp --docker
77
RUN find . -name "node_modules" -type d -prune -exec rm -rf '{}' +
88

99
# Base strategy to have layer caching
10-
FROM node:18 AS base
11-
RUN apt-get update && apt-get install -y openssl
10+
FROM node:18.16.1-bullseye-slim AS base
11+
RUN apt-get update && apt-get install -y openssl dumb-init
1212
WORKDIR /triggerdotdev
13-
COPY .gitignore .gitignore
14-
COPY --from=pruner /triggerdotdev/out/json/ .
15-
COPY --from=pruner /triggerdotdev/out/pnpm-lock.yaml ./pnpm-lock.yaml
16-
COPY --from=pruner /triggerdotdev/out/pnpm-workspace.yaml ./pnpm-workspace.yaml
13+
COPY --chown=node:node .gitignore .gitignore
14+
COPY --from=pruner --chown=node:node /triggerdotdev/out/json/ .
15+
COPY --from=pruner --chown=node:node /triggerdotdev/out/pnpm-lock.yaml ./pnpm-lock.yaml
16+
COPY --from=pruner --chown=node:node /triggerdotdev/out/pnpm-workspace.yaml ./pnpm-workspace.yaml
1717

1818
## Dev deps
1919
FROM base AS dev-deps
@@ -30,41 +30,43 @@ WORKDIR /triggerdotdev
3030
RUN corepack enable
3131
ENV NODE_ENV production
3232
RUN pnpm install --prod --no-frozen-lockfile
33-
COPY --from=pruner /triggerdotdev/packages/database/prisma/schema.prisma /triggerdotdev/packages/database/prisma/schema.prisma
33+
COPY --from=pruner --chown=node:node /triggerdotdev/packages/database/prisma/schema.prisma /triggerdotdev/packages/database/prisma/schema.prisma
3434
RUN pnpx prisma@^4.16.0 generate --schema /triggerdotdev/packages/database/prisma/schema.prisma
3535

3636
## Builder (builds the webapp)
3737
FROM base AS builder
3838
WORKDIR /triggerdotdev
3939
# Corepack is used to install pnpm
4040
RUN corepack enable
41-
COPY --from=pruner /triggerdotdev/out/full/ .
42-
COPY --from=dev-deps /triggerdotdev/ .
43-
COPY turbo.json turbo.json
44-
COPY docker/scripts ./scripts
41+
COPY --from=pruner --chown=node:node /triggerdotdev/out/full/ .
42+
COPY --from=dev-deps --chown=node:node /triggerdotdev/ .
43+
COPY --chown=node:node turbo.json turbo.json
44+
COPY --chown=node:node docker/scripts ./scripts
4545
RUN chmod +x ./scripts/wait-for-it.sh
4646
RUN chmod +x ./scripts/entrypoint.sh
4747
RUN pnpm run generate
4848
RUN pnpm run build --filter=webapp...
4949

5050
# Runner
51-
FROM node:18 AS runner
51+
FROM node:18.16.1-bullseye-slim AS runner
5252
RUN apt-get update && apt-get install -y openssl
5353
WORKDIR /triggerdotdev
5454
RUN corepack enable
5555
ENV NODE_ENV production
5656

57-
COPY --from=pruner /triggerdotdev/out/full/ .
58-
COPY --from=production-deps /triggerdotdev .
59-
COPY --from=builder /triggerdotdev/apps/webapp/build/server.js ./apps/webapp/build/server.js
60-
COPY --from=builder /triggerdotdev/apps/webapp/build ./apps/webapp/build
61-
COPY --from=builder /triggerdotdev/apps/webapp/public ./apps/webapp/public
62-
COPY --from=builder /triggerdotdev/scripts ./scripts
57+
COPY --from=base /usr/bin/dumb-init /usr/bin/dumb-init
58+
COPY --from=pruner --chown=node:node /triggerdotdev/out/full/ .
59+
COPY --from=production-deps --chown=node:node /triggerdotdev .
60+
COPY --from=builder --chown=node:node /triggerdotdev/apps/webapp/build/server.js ./apps/webapp/build/server.js
61+
COPY --from=builder --chown=node:node /triggerdotdev/apps/webapp/build ./apps/webapp/build
62+
COPY --from=builder --chown=node:node /triggerdotdev/apps/webapp/public ./apps/webapp/public
63+
COPY --from=builder --chown=node:node /triggerdotdev/scripts ./scripts
6364

6465
EXPOSE 3000
6566

6667
# This is needed to run migrations in the entrypoint.sh script (TODO: figure out a better way to do this)
6768
RUN npm install -g prisma@4.16.0
6869
RUN npm install -g ts-node@10.9.1
6970

70-
CMD ["./scripts/entrypoint.sh"]
71+
USER node
72+
CMD ["./scripts/entrypoint.sh"]

‎docker/scripts/entrypoint.sh‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@ npx --no-install prisma migrate deploy --schema /triggerdotdev/packages/database
99
npx --no-install ts-node --transpile-only /triggerdotdev/apps/webapp/prisma/seed.ts
1010

1111
cd /triggerdotdev/apps/webapp
12-
exec pnpm run start
12+
exec dumb-init pnpm run start

‎pnpm-lock.yaml‎

Lines changed: 19 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)