[Unit] Description=PostgreSQL Database Server - Initialization Documentation=https://hub.docker.com/_/postgres/ After=network.target postgresql-set-major.service Before=postgresql-server.service Requires=postgresql-set-major.service # Only start if PostgreSQL has been configured ConditionPathExists=/etc/quadlets/postgresql/config.env # and NOT initialized ConditionPathExists=!/var/lib/quadlets/postgresql/.initialized # Start/stop this unit when the target is started/stopped PartOf=postgresql.target [Container] ContainerName=postgresql-init-job Image=docker.io/library/postgres:${PG_MAJOR}-alpine # Network configuration Network=host # PostgreSQL storage is specific to major version Environment=PGDATA=/var/lib/postgresql/${PG_MAJOR}/docker # Those environment variables will be injected by podman into the container EnvironmentFile=/etc/quadlets/postgresql/config.env # Use our entrypoint script to initialize the database Entrypoint=/usr/local/bin/init.sh # Set PostgreSQL command line arguments Exec=${POSTGRES_ARGS} # No need for root privileges User=postgres Group=postgres # UID/GID mapping to map the postgres (70) user inside the container to arbitrary user 10004 / group 10000 on the host UIDMap=0:1000000:65535 UIDMap=+70:10004:1 GIDMap=0:1000000:65535 GIDMap=+70:10000:1 # Avoid issues with built-in volumes being created by root PodmanArgs=--image-volume=ignore # Volume mounts Volume=/var/lib/quadlets/postgresql:/var/lib/postgresql:z Volume=/var/lib/virtiofs/data/postgresql/backup:/var/lib/postgresql/backup:z Volume=/etc/quadlets/postgresql/init.sh:/usr/local/bin/init.sh:z,ro Volume=/etc/quadlets/postgresql/init.d:/docker-entrypoint-initdb.d:z,ro [Service] Restart=no TimeoutStartSec=30 # These environment variables are sourced to be used by systemd in the Exec* commands EnvironmentFile=/etc/quadlets/postgresql/config.env # This container is a job - run once to completion Type=oneshot # Mark the database as intialized ExecStartPost=touch /var/lib/quadlets/postgresql/.initialized [Install] WantedBy=postgresql.target