postgres builds its own runtime, like any other module

Its provisioner container named an image nobody could produce — a zero digest
placeholder. It names an artifact instead, and the module says how to build it,
so the mesh can make the database provider the catalogue needs.
This commit is contained in:
2026-09-13 01:10:45 +02:00
parent 2a6fed6f4f
commit d6c9c8d666
2 changed files with 44 additions and 3 deletions
+28
View File
@@ -0,0 +1,28 @@
# postgres's runtime: the tool runtime, carrying this module's compiled provisioner, tools and
# event consumer.
#
# **Built from this module's own directory and nothing else.** The sdk is in the base image, so
# nothing is copied out of a neighbouring checkout — which is what lets the mesh build this from a
# repository and a path (novox/hq ADR 0069) rather than only on a workstation that happens to have
# the siblings.
#
# The base is named by ARG so it can be pinned to a digest the mesh's registry assigned. A tag would
# make this runtime's contents depend on what somebody last pushed under that name.
ARG RUNTIME_BASE=127.0.0.1:5000/mesh-tool-runtime@sha256:d4d793c828a5f563fdd8f49e5c6026d17b308a3f7a13c589849188362e4c7415
FROM ${RUNTIME_BASE} AS build
# Compiled under /app/modules so `@novox/mesh-sdk` resolves upward into the base's own
# node_modules — the module is compiled against exactly the sdk it will run against.
WORKDIR /app/modules/postgres
COPY . .
# The compiler is invoked by its real path rather than through node_modules/.bin, whose entries are
# symlinks to a launcher that requires its library relatively — resolved away when the base image
# was assembled.
RUN node /app/node_modules/typescript/bin/tsc client.ts index.ts provisioner/index.ts tools/index.ts \
--module NodeNext --moduleResolution NodeNext --target ES2022 --outDir dist
FROM ${RUNTIME_BASE}
COPY --from=build /app/modules/postgres/dist /app/modules/postgres/dist
# Which of the three the container runs is the declaration's business, said in its `args` — one
# image, because they are one module and share a client.
ENV MESH_TOOL_MODULES=/app/modules/postgres/dist/index.js
+16 -3
View File
@@ -102,7 +102,6 @@
"id": "runtime", "id": "runtime",
"type": "container", "type": "container",
"name": "mesh-postgres", "name": "mesh-postgres",
"image": "mesh-runtime-postgres@sha256:0000000000000000000000000000000000000000000000000000000000000000",
"network": "postgres", "network": "postgres",
"volumes": [ "volumes": [
"/var/lib/mesh/postgres/broker:/run/secrets/broker:ro", "/var/lib/mesh/postgres/broker:/run/secrets/broker:ro",
@@ -114,7 +113,21 @@
"MESH_PROVISION_PASSWORD_FILE": "/run/secrets/superuser", "MESH_PROVISION_PASSWORD_FILE": "/run/secrets/superuser",
"MESH_BROKER_FILE": "/run/secrets/broker", "MESH_BROKER_FILE": "/run/secrets/broker",
"MESH_RECEIVES": "/var/lib/postgres/grants/mesh.json" "MESH_RECEIVES": "/var/lib/postgres/grants/mesh.json"
} },
"artifact": "runtime",
"args": [
"run",
"/app/modules/postgres/dist/provisioner/index.js"
]
} }
] ],
"build": {
"artifacts": [
{
"name": "runtime",
"kind": "image",
"from": "Dockerfile"
}
]
}
} }