Are you aware of extension_control_path? [0] Since PG18 it allows specifying multiple non-$system directories for extension control paths, which makes it easier to adopt composable patterns of extension bundling with immutable images.
CloudNativePG uses this for its Image Volume Extensions feature [1]. A lot of the CNPG team worked on contributing this to PG core because previously the only alternative was baking “God images” at build time (“-full” in this readme) with all extensions in them.
Now with the extension_control_path GUC, it’s possible to “attach” extensions as container volumes at runtime, without rebuilding the image of the container. Maybe you can adopt a similar approach in pglayers.
@chatmasta Thanks again for the pointer. I just added the implementation now for the images based on PG 18+ I really like the idea of adding your layers at deploy time so this is a nice improvement.
Yes, I thought this approach should work, but why nobody has done it. The only real issue is file collisions, which I test for aggressively. So far, I've only found a few minor cases that I either worked around or reported to the relevant projects (e.g. some projects package the extension with a generic README.md file) instead of an extension-specific one.
One surprising benefit that I hadn't considered when implementing this is that when I add new extensions or update existing ones, users only need to update the affected layers. As a result, update times are minimal.
Good ideas, thanks. My target audience is both less technical and technical users who don't care about the low level details of databases but just want to run their code that uses the db extensions without the need to learn about the internals of the database to be able to use them.
CloudNativePG uses this for its Image Volume Extensions feature [1]. A lot of the CNPG team worked on contributing this to PG core because previously the only alternative was baking “God images” at build time (“-full” in this readme) with all extensions in them.
Now with the extension_control_path GUC, it’s possible to “attach” extensions as container volumes at runtime, without rebuilding the image of the container. Maybe you can adopt a similar approach in pglayers.
[0] https://postgresqlco.nf/doc/en/param/extension_control_path/
[1] https://cloudnative-pg.io/docs/1.30/imagevolume_extensions/