Skip to content

Commit befb489

Browse files
authored
Optimize Docker Image (#851)
- bundle application with tsup - replace ofetch with xior this should reduce the docker image size by a decent amount of megabytes, and speed up startup/runtime an imperceptable amount
1 parent 9669e9c commit befb489

11 files changed

+620
-257
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
.idea/
22
.env
33
coverage/
4+
dist/
45
sqlite/
56
redoc-static.html
67

Dockerfile

+11-9
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,26 @@ FROM base as base_deps
1616
ENV CI=1
1717

1818
COPY .npmrc package.json pnpm-lock.yaml ./
19+
COPY patches/ patches/
1920

2021
RUN corepack enable
2122
RUN corepack prepare --activate
2223

23-
FROM base_deps as runtime_deps
24-
2524
# Install dependencies
2625
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
27-
pnpm install --frozen-lockfile --production
26+
pnpm install --frozen-lockfile
27+
28+
FROM base_deps as build
29+
30+
COPY knexfile.js tsconfig.json tsup.config.ts ./
31+
COPY src/ src/
32+
33+
RUN pnpm run build
2834

2935
FROM base_deps AS docs
3036

3137
COPY docs/openapi.yaml docs/openapi.yaml
3238

33-
# Install dependencies
34-
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
35-
pnpm install --frozen-lockfile
36-
3739
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
3840
pnpm run docs
3941

@@ -43,7 +45,7 @@ COPY .npmrc knexfile.js package.json pnpm-lock.yaml ./
4345
COPY src/ src/
4446
COPY migrations/ migrations/
4547

46-
COPY --from=runtime_deps /app/node_modules/ node_modules/
48+
COPY --from=build /app/dist dist/
4749
COPY --from=docs /app/redoc-static.html .
4850

4951
# Run with...
@@ -52,4 +54,4 @@ ENV NODE_OPTIONS="--enable-source-maps"
5254
# Warnings disabled, we know what we're doing and they're annoying
5355
ENV NODE_NO_WARNINGS=1
5456

55-
CMD ["node", "--run", "start"]
57+
CMD ["node", "dist/index.js"]

knexfile.js

+4
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,9 @@ export default {
1212
useNullAsDefault: true,
1313
connection: {
1414
filename: `./sqlite/${process.env.NODE_ENV ?? "development"}.sqlite3`,
15+
options: {
16+
nativeBinding:
17+
process.env.NODE_ENV === "production" ? "./dist/better_sqlite3.node" : undefined,
18+
},
1519
},
1620
}

package.json

+20-16
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"*.{js,cjs,mjs,ts,cts,mts,json}": ["biome check --fix"]
1818
},
1919
"scripts": {
20+
"build": "tsup",
2021
"dev": "node --experimental-strip-types --experimental-transform-types --watch src/index.ts",
2122
"docs": "pnpm --package=@redocly/cli dlx redocly build-docs docs/openapi.yaml",
2223
"docs:dev": "onchange --initial --kill docs/openapi.yaml -- pnpm --silent run docs",
@@ -34,38 +35,38 @@
3435
"resolutions": {
3536
"esbuild": "0.25.0"
3637
},
37-
"dependencies": {
38+
"devDependencies": {
39+
"@antfu/eslint-config": "4.4.0",
40+
"@biomejs/biome": "1.9.4",
3841
"@hono/node-server": "1.13.8",
3942
"@hono/sentry": "1.2.0",
4043
"@hono/standard-validator": "0.1.2",
4144
"@sentry/node": "9.3.0",
42-
"better-sqlite3": "11.8.1",
43-
"hono": "4.7.2",
44-
"is-ci": "4.1.0",
45-
"knex": "3.1.0",
46-
"ofetch": "1.4.1",
47-
"pino": "9.6.0",
48-
"valibot": "1.0.0-rc.3"
49-
},
50-
"devDependencies": {
51-
"@antfu/eslint-config": "4.3.0",
52-
"@biomejs/biome": "1.9.4",
5345
"@standard-schema/spec": "1.0.0",
5446
"@tsconfig/node22": "22.0.0",
5547
"@tsconfig/strictest": "2.0.5",
5648
"@types/json-schema": "7.0.15",
57-
"@types/node": "22.13.8",
49+
"@types/node": "22.13.9",
5850
"@vitest/coverage-v8": "3.0.7",
51+
"better-sqlite3": "11.8.1",
5952
"dotenv": "16.4.7",
6053
"eslint": "9.21.0",
54+
"hono": "4.7.2",
55+
"is-ci": "4.1.0",
56+
"knex": "3.1.0",
57+
"mentoss": "0.7.1",
6158
"nano-staged": "0.8.0",
6259
"onchange": "7.1.0",
60+
"pino": "9.6.0",
6361
"pino-pretty": "13.0.0",
6462
"simple-git-hooks": "2.11.1",
6563
"tsconfig-paths": "4.2.0",
66-
"type-fest": "4.36.0",
64+
"tsup": "8.4.0",
65+
"type-fest": "4.37.0",
6766
"typescript": "5.8.2",
68-
"vitest": "3.0.7"
67+
"valibot": "1.0.0-rc.3",
68+
"vitest": "3.0.7",
69+
"xior": "0.7.0"
6970
},
7071
"pnpm": {
7172
"overrides": {
@@ -83,6 +84,9 @@
8384
"safe-buffer": "npm:@nolyfill/safe-buffer@^1"
8485
},
8586
"onlyBuiltDependencies": ["better-sqlite3"],
86-
"ignoredBuiltDependencies": ["@biomejs/biome", "esbuild", "simple-git-hooks"]
87+
"ignoredBuiltDependencies": ["@biomejs/biome", "esbuild", "simple-git-hooks"],
88+
"patchedDependencies": {
89+
"knex": "patches/knex.patch"
90+
}
8791
}
8892
}

patches/knex.patch

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
diff --git a/lib/dialects/index.js b/lib/dialects/index.js
2+
index 559a366685d6517de819d1925233e972089928e7..476dcc63fd84758a7c65b1d4b493b73460f62764 100644
3+
--- a/lib/dialects/index.js
4+
+++ b/lib/dialects/index.js
5+
@@ -4,16 +4,6 @@ exports.getDialectByNameOrAlias = void 0;
6+
const { resolveClientNameWithAliases } = require('../util/helpers');
7+
const dbNameToDialectLoader = Object.freeze({
8+
'better-sqlite3': () => require('./better-sqlite3'),
9+
- cockroachdb: () => require('./cockroachdb'),
10+
- mssql: () => require('./mssql'),
11+
- mysql: () => require('./mysql'),
12+
- mysql2: () => require('./mysql2'),
13+
- oracle: () => require('./oracle'),
14+
- oracledb: () => require('./oracledb'),
15+
- pgnative: () => require('./pgnative'),
16+
- postgres: () => require('./postgres'),
17+
- redshift: () => require('./redshift'),
18+
- sqlite3: () => require('./sqlite3'),
19+
});
20+
/**
21+
* Gets the Dialect object with the given client name or throw an

0 commit comments

Comments
 (0)