Build custom container images / build (map[base_image:php:8-fpm-alpine build_args:PHP_VERSION=8
context:php8-pgsql fingerprint_command:{ apk info -v | LC_ALL=C sort; find /usr/local/lib/php/extensions /usr/local/etc/php/conf.d -type f -exec sha256sum {} + | LC_ALL=C sort; }
name:ph… (push) Successful in 49s
Build custom container images / build (map[base_image:postgres:18 build_args:PG_VERSION=18
POSTGIS_VERSION=3
VCHORD_VERSION=0.5.3
context:postgres fingerprint_command:{ dpkg-query -W -f='${binary:Package}=${Version}\n' | LC_ALL=C sort; find /usr/lib/postgresql -type f -exec sha256su… (push) Successful in 1m42s
Build custom container images / build (map[base_image:python:3 build_args:PYTHON_VERSION=3
context:python-tools fingerprint_command:{ dpkg-query -W -f='${binary:Package}=${Version}\n' | LC_ALL=C sort; pip freeze | LC_ALL=C sort; }
name:python-tools oci_labels:org.opencontainers.ima… (push) Successful in 54s
Build custom container images / build (map[base_image:python:3.12-slim build_args:PYTHON_VERSION=3.12-slim
context:linkki-tiedotus fingerprint_command:{ dpkg-query -W -f='${binary:Package}=${Version}\n' | LC_ALL=C sort; pip freeze | LC_ALL=C sort; }
name:linkki-tiedotus oci_labels:… (push) Successful in 29s
Build custom container images / build (map[base_image:python:3.12-slim build_args:PYTHON_VERSION=3.12-slim
context:timepoll fingerprint_command:{ dpkg-query -W -f='${binary:Package}=${Version}\n' | LC_ALL=C sort; pip freeze | LC_ALL=C sort; }
name:timepoll oci_labels:org.opencontai… (push) Successful in 44s
175 lines
5.6 KiB
Markdown
175 lines
5.6 KiB
Markdown
# Custom Container Images
|
|
|
|
This repository builds a small set of OCI/container images published at
|
|
`git.ajpanton.se`.
|
|
|
|
The images include extended database/runtime images and standalone self-hosted
|
|
applications. Each image has its own build context and documentation.
|
|
|
|
## Images
|
|
|
|
| Image | Description |
|
|
| --- | --- |
|
|
| `git.ajpanton.se/ajp_anton/postgres-custom:18` | PostgreSQL 18 with selected extension packages installed and `pg_cron`/VectorChord preloaded. |
|
|
| `git.ajpanton.se/ajp_anton/php8-pgsql:8` | PHP 8 FPM on Alpine with PostgreSQL client runtime support and the `pdo_pgsql` PHP extension enabled. |
|
|
| `git.ajpanton.se/ajp_anton/python-tools:3` | Python 3 task runner with ExifTool and a web control panel for mounted task scripts. |
|
|
| `git.ajpanton.se/ajp_anton/linkki-tiedotus:1` | Web editor and scheduler for multilingual Telegram channel broadcasts. |
|
|
| `git.ajpanton.se/ajp_anton/timepoll:1` | Timezone-aware availability polls with a live voting grid. |
|
|
|
|
## Included Components
|
|
|
|
### `postgres-custom`
|
|
|
|
Base image:
|
|
|
|
- `postgres:18`
|
|
- Moving upstream major-version tag. Patch releases are picked up when the image
|
|
is rebuilt.
|
|
|
|
Installed from Debian/PostgreSQL apt repositories:
|
|
|
|
- `ca-certificates`
|
|
- `wget`
|
|
- `postgresql-18-cron`
|
|
- `postgresql-18-pgvector`
|
|
- `postgresql-18-postgis-3`
|
|
|
|
Installed from a GitHub release asset:
|
|
|
|
- VectorChord package `postgresql-18-vchord_0.5.3-1_amd64.deb`
|
|
- VectorChord is pinned to `0.5.3` at this time.
|
|
|
|
Runtime defaults added by this image:
|
|
|
|
- `shared_preload_libraries=pg_cron,vchord`
|
|
- `cron.database_name=firecrawl`
|
|
|
|
### `php8-pgsql`
|
|
|
|
Base image:
|
|
|
|
- `php:8-fpm-alpine`
|
|
- Moving upstream major-version tag. Patch releases are picked up when the image
|
|
is rebuilt.
|
|
|
|
Build-time package:
|
|
|
|
- `postgresql-dev`
|
|
|
|
Runtime package:
|
|
|
|
- `libpq`
|
|
|
|
Compiled PHP extension:
|
|
|
|
- `pdo_pgsql`
|
|
|
|
The compiled extension and PHP config are copied from a build stage into the
|
|
final runtime image.
|
|
|
|
### `python-tools`
|
|
|
|
Base image:
|
|
|
|
- `python:3`
|
|
- The image follows the moving Python 3 tag. When upstream Python 3 moves to a
|
|
new minor release, this image follows it on the next rebuild.
|
|
|
|
Installed from Debian apt repositories:
|
|
|
|
- `ca-certificates`
|
|
- `exiftool`
|
|
|
|
Pinned Python packages:
|
|
|
|
- `Flask==3.1.0`
|
|
- `waitress==3.0.2`
|
|
|
|
Included application:
|
|
|
|
- A server-rendered web control panel for discovering and running reviewed
|
|
Python scripts mounted at runtime, with typed form inputs and optional
|
|
internal recurring jobs.
|
|
- Per-group task queues, SQLite run history, captured output, and task-process
|
|
cancellation.
|
|
- The default command starts the control panel with `python -m app`.
|
|
|
|
Intended use:
|
|
|
|
- Run reviewed, autonomous task scripts mounted at runtime.
|
|
- Use the included task control panel. Its generic deployment example and
|
|
application documentation are in `python-tools/`.
|
|
- Keep host systems clean by avoiding host-level package installs.
|
|
|
|
### `linkki-tiedotus`
|
|
|
|
Base image:
|
|
|
|
- `python:3.12-slim`
|
|
- Moving upstream Python 3.12 patch-version tag. Base-image updates are picked
|
|
up on the next rebuild.
|
|
|
|
Included application:
|
|
|
|
- FastAPI web editor for drafting, scheduling, publishing, updating, and
|
|
deleting multilingual Telegram channel broadcasts.
|
|
- A persistent `/data` directory for configuration, user records, posts,
|
|
uploaded images, schedules, and publish history.
|
|
- The default command starts the application on port `8080`.
|
|
|
|
The image contains no configuration or broadcast data. Mount `/data` from a
|
|
persistent host directory and create its configuration from `linkki-tiedotus/config-examples/`.
|
|
|
|
### `timepoll`
|
|
|
|
Base image: `python:3.12-slim`, following Python 3.12 patch releases.
|
|
|
|
- Standalone FastAPI application with SQLite persistence and live browser updates.
|
|
- UTC-based yes/maybe voting, IANA timezones, optional blackouts, and private
|
|
poll administration links. No accounts required.
|
|
- FastAPI and Uvicorn follow releases below version 1; `tzdata` follows available
|
|
releases. Lucide browser icons are bundled at version 0.468.0.
|
|
- Persistent data is stored in `/data`; the application listens on port `8080`.
|
|
|
|
See [Timepoll's README](timepoll/README.md) for setup, voting rules and testing.
|
|
|
|
## Tags
|
|
|
|
Moving deployment tags:
|
|
|
|
- `git.ajpanton.se/ajp_anton/postgres-custom:18`
|
|
- `git.ajpanton.se/ajp_anton/php8-pgsql:8`
|
|
- `git.ajpanton.se/ajp_anton/python-tools:3`
|
|
- `git.ajpanton.se/ajp_anton/linkki-tiedotus:1`
|
|
- `git.ajpanton.se/ajp_anton/timepoll:1`
|
|
|
|
Descriptive tags:
|
|
|
|
- `git.ajpanton.se/ajp_anton/postgres-custom:18-postgis3-vchord0.5.3`
|
|
- `git.ajpanton.se/ajp_anton/php8-pgsql:8-fpm-alpine`
|
|
|
|
Convenience tags:
|
|
|
|
- `git.ajpanton.se/ajp_anton/postgres-custom:latest`
|
|
- `git.ajpanton.se/ajp_anton/php8-pgsql:latest`
|
|
- `git.ajpanton.se/ajp_anton/python-tools:latest`
|
|
- `git.ajpanton.se/ajp_anton/linkki-tiedotus:latest`
|
|
- `git.ajpanton.se/ajp_anton/timepoll:latest`
|
|
|
|
Tags are mutable. A weekly candidate build only repoints a deployment tag when
|
|
its content fingerprint changed: base image, build context, build arguments,
|
|
installed packages, or image-specific generated files.
|
|
|
|
## Update Cadence
|
|
|
|
Images are rebuilt weekly. They may also be rebuilt after repository changes or
|
|
manual runs. Each run builds a candidate without cache, then publishes it only
|
|
when its content fingerprint differs from the current deployment image.
|
|
|
|
Each rebuild pulls the current upstream base image and installs the currently
|
|
available apt/apk packages. If the base image or repository packages changed,
|
|
the resulting image digest changes and the same tag points to the new image.
|
|
|
|
Pinned build inputs do not update automatically. In this repository, VectorChord
|
|
is pinned to `0.5.3`; changing it requires a repository update.
|