Reusable LinuxServer.io-inspired Docker image template for self-built homelab images.
This is the master template for future image repositories. It intentionally synthesizes the useful parts from the older image repos instead of copying their historical ballast:
- Make ideas from
rclone,serpbear, andtandoor - Container operation helpers from
abs-tracked - SBOM/security ideas from
audiobookshelf - The current GitHub → Codeberg/GitLab
mirror.yml
- Consistent LinuxServer.io-style runtime foundation.
- s6-overlay v3 supervision patterns.
- Secure
makeworkflows for secrets and local automation. - Local build, smoke, scan, SBOM, and container-debug targets.
- Reusable GitHub Actions workflow for multiarch Docker builds.
- Git mirrors to Codeberg and GitLab.
- Registry strategy: GHCR and Docker Hub first; GitLab/Codeberg registries after the image is proven.
This repository is the template. Real images live in their own repositories, for example:
postgresqlmariadb
PostgreSQL and MariaDB are deliberately not kept under examples/; they are validation projects and future standalone image repos.
make help
make info
make lint
make env-setup
make secret SECRET_NAME=secrets/my_service_password.txtFor a real image repo copied from this template:
make build IMAGE_NAME=my-image APP_VERSION=1.2.3 IMAGE_REVISION=mldm1
make security-scan IMAGE_NAME=my-image APP_VERSION=1.2.3 IMAGE_REVISION=mldm1
make sbom IMAGE_NAME=my-image APP_VERSION=1.2.3 IMAGE_REVISION=mldm1If the local Docker socket needs sudo:
make build DOCKER='sudo docker'
make security-scan DOCKER='sudo docker'| Setting | Default |
|---|---|
| Image revision suffix | mldm<N> |
| Required CI platforms | linux/amd64,linux/arm64 |
| Raspberry Pi 32-bit | best effort only; verify base image manifest first |
| Base image policy | pin real LSIO base tags, never latest |
| Runtime user policy | s6 starts as root, final app process drops to abc |
| Secrets | generated by Python CSPRNG, mode 0600, values never printed |
docs/architecture.mddocs/make-targets.mddocs/secrets.mddocs/security-sbom.mddocs/registries.mddocs/upstream-policy.mddocs/versioning.mddocs/licensing.mddocs/implementation-plan.md
The template itself has no production Dockerfile, so build targets intentionally fail with a clear message until copied into an image repository.
Static verification:
make lint
make validate
actionlintThe pilot images now live in standalone repositories named after the image:
postgresqlmariadb
Repository names match the image names. LSIO-style behavior is documented in the image metadata and README instead.