├── .gitattributes ├── .github └── workflows │ ├── ci.yml │ └── verify-templating.yml ├── .gitignore ├── 13-to-14 ├── Dockerfile └── docker-upgrade ├── 13-to-15 ├── Dockerfile └── docker-upgrade ├── 13-to-16 ├── Dockerfile └── docker-upgrade ├── 13-to-17 ├── Dockerfile └── docker-upgrade ├── 14-to-15 ├── Dockerfile └── docker-upgrade ├── 14-to-16 ├── Dockerfile └── docker-upgrade ├── 14-to-17 ├── Dockerfile └── docker-upgrade ├── 15-to-16 ├── Dockerfile └── docker-upgrade ├── 15-to-17 ├── Dockerfile └── docker-upgrade ├── 16-to-17 ├── Dockerfile └── docker-upgrade ├── Dockerfile.template ├── LICENSE ├── README.md ├── apply-templates.sh ├── docker-upgrade ├── generate-stackbrew-library.sh ├── update.sh ├── versions.json └── versions.sh /.gitattributes: -------------------------------------------------------------------------------- 1 | /*/**/Dockerfile linguist-generated 2 | /*/**/docker-upgrade linguist-generated 3 | /Dockerfile.template linguist-language=Dockerfile 4 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | pull_request: 5 | push: 6 | schedule: 7 | - cron: 0 0 * * 0 8 | 9 | defaults: 10 | run: 11 | shell: 'bash -Eeuo pipefail -x {0}' 12 | 13 | jobs: 14 | 15 | generate-jobs: 16 | name: Generate Jobs 17 | runs-on: ubuntu-latest 18 | outputs: 19 | strategy: ${{ steps.generate-jobs.outputs.strategy }} 20 | steps: 21 | - uses: actions/checkout@v4 22 | - uses: docker-library/bashbrew@HEAD 23 | - id: generate-jobs 24 | name: Generate Jobs 25 | run: | 26 | export BASHBREW_NAMESPACE='tianon' 27 | image="${GITHUB_REPOSITORY##*/}" 28 | image="${image#docker-}" 29 | export GITHUB_REPOSITORY="$image" 30 | strategy="$("$BASHBREW_SCRIPTS/github-actions/generate.sh")" 31 | echo "strategy=$strategy" >> "$GITHUB_OUTPUT" 32 | jq . <<<"$strategy" # sanity check / debugging aid 33 | 34 | test: 35 | needs: generate-jobs 36 | strategy: ${{ fromJson(needs.generate-jobs.outputs.strategy) }} 37 | name: ${{ matrix.name }} 38 | runs-on: ${{ matrix.os }} 39 | steps: 40 | - uses: actions/checkout@v4 41 | - name: Prepare Environment 42 | run: ${{ matrix.runs.prepare }} 43 | - name: Pull Dependencies 44 | run: ${{ matrix.runs.pull }} 45 | - name: Build ${{ matrix.name }} 46 | run: ${{ matrix.runs.build }} 47 | - name: History ${{ matrix.name }} 48 | run: ${{ matrix.runs.history }} 49 | - name: Test ${{ matrix.name }} 50 | run: ${{ matrix.runs.test }} 51 | - name: '"docker images"' 52 | run: ${{ matrix.runs.images }} 53 | -------------------------------------------------------------------------------- /.github/workflows/verify-templating.yml: -------------------------------------------------------------------------------- 1 | name: Verify Templating 2 | 3 | on: 4 | pull_request: 5 | push: 6 | 7 | defaults: 8 | run: 9 | shell: 'bash -Eeuo pipefail -x {0}' 10 | 11 | jobs: 12 | apply-templates: 13 | name: Check For Uncomitted Changes 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v4 17 | - name: Clean 18 | run: rm -rf */ 19 | - name: Apply Templates 20 | run: ./apply-templates.sh 21 | - name: Check Git Status 22 | run: | 23 | status="$(git status --short)" 24 | [ -z "$status" ] 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .jq-template.awk 2 | -------------------------------------------------------------------------------- /13-to-14/Dockerfile: -------------------------------------------------------------------------------- 1 | # 2 | # NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh" 3 | # 4 | # PLEASE DO NOT EDIT IT DIRECTLY. 5 | # 6 | 7 | FROM postgres:14-bookworm 8 | 9 | RUN sed -i 's/$/ 13/' /etc/apt/sources.list.d/pgdg.list 10 | 11 | RUN set -eux; \ 12 | apt-get update; \ 13 | apt-get install -y --no-install-recommends \ 14 | postgresql-13='13.21-1.pgdg120+1' \ 15 | ; \ 16 | rm -rf /var/lib/apt/lists/* 17 | 18 | ENV PGBINOLD /usr/lib/postgresql/13/bin 19 | ENV PGBINNEW /usr/lib/postgresql/14/bin 20 | 21 | ENV PGDATAOLD /var/lib/postgresql/13/data 22 | ENV PGDATANEW /var/lib/postgresql/14/data 23 | 24 | RUN set -eux; \ 25 | mkdir -p "$PGDATAOLD" "$PGDATANEW"; \ 26 | chown -R postgres:postgres /var/lib/postgresql 27 | 28 | WORKDIR /var/lib/postgresql 29 | 30 | COPY docker-upgrade /usr/local/bin/ 31 | 32 | ENTRYPOINT ["docker-upgrade"] 33 | 34 | # recommended: --link 35 | CMD ["pg_upgrade"] 36 | -------------------------------------------------------------------------------- /13-to-14/docker-upgrade: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [ "$#" -eq 0 -o "${1:0:1}" = '-' ]; then 5 | set -- pg_upgrade "$@" 6 | fi 7 | 8 | if [ "$1" = 'pg_upgrade' -a "$(id -u)" = '0' ]; then 9 | mkdir -p "$PGDATAOLD" "$PGDATANEW" 10 | chmod 700 "$PGDATAOLD" "$PGDATANEW" 11 | chown postgres . 12 | chown -R postgres "$PGDATAOLD" "$PGDATANEW" 13 | exec gosu postgres "$BASH_SOURCE" "$@" 14 | fi 15 | 16 | if [ "$1" = 'pg_upgrade' ]; then 17 | if [ ! -s "$PGDATANEW/PG_VERSION" ]; then 18 | PGDATA="$PGDATANEW" eval "initdb $POSTGRES_INITDB_ARGS" 19 | fi 20 | fi 21 | 22 | exec "$@" 23 | -------------------------------------------------------------------------------- /13-to-15/Dockerfile: -------------------------------------------------------------------------------- 1 | # 2 | # NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh" 3 | # 4 | # PLEASE DO NOT EDIT IT DIRECTLY. 5 | # 6 | 7 | FROM postgres:15-bookworm 8 | 9 | RUN sed -i 's/$/ 13/' /etc/apt/sources.list.d/pgdg.list 10 | 11 | RUN set -eux; \ 12 | apt-get update; \ 13 | apt-get install -y --no-install-recommends \ 14 | postgresql-13='13.21-1.pgdg120+1' \ 15 | ; \ 16 | rm -rf /var/lib/apt/lists/* 17 | 18 | ENV PGBINOLD /usr/lib/postgresql/13/bin 19 | ENV PGBINNEW /usr/lib/postgresql/15/bin 20 | 21 | ENV PGDATAOLD /var/lib/postgresql/13/data 22 | ENV PGDATANEW /var/lib/postgresql/15/data 23 | 24 | RUN set -eux; \ 25 | mkdir -p "$PGDATAOLD" "$PGDATANEW"; \ 26 | chown -R postgres:postgres /var/lib/postgresql 27 | 28 | WORKDIR /var/lib/postgresql 29 | 30 | COPY docker-upgrade /usr/local/bin/ 31 | 32 | ENTRYPOINT ["docker-upgrade"] 33 | 34 | # recommended: --link 35 | CMD ["pg_upgrade"] 36 | -------------------------------------------------------------------------------- /13-to-15/docker-upgrade: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [ "$#" -eq 0 -o "${1:0:1}" = '-' ]; then 5 | set -- pg_upgrade "$@" 6 | fi 7 | 8 | if [ "$1" = 'pg_upgrade' -a "$(id -u)" = '0' ]; then 9 | mkdir -p "$PGDATAOLD" "$PGDATANEW" 10 | chmod 700 "$PGDATAOLD" "$PGDATANEW" 11 | chown postgres . 12 | chown -R postgres "$PGDATAOLD" "$PGDATANEW" 13 | exec gosu postgres "$BASH_SOURCE" "$@" 14 | fi 15 | 16 | if [ "$1" = 'pg_upgrade' ]; then 17 | if [ ! -s "$PGDATANEW/PG_VERSION" ]; then 18 | PGDATA="$PGDATANEW" eval "initdb $POSTGRES_INITDB_ARGS" 19 | fi 20 | fi 21 | 22 | exec "$@" 23 | -------------------------------------------------------------------------------- /13-to-16/Dockerfile: -------------------------------------------------------------------------------- 1 | # 2 | # NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh" 3 | # 4 | # PLEASE DO NOT EDIT IT DIRECTLY. 5 | # 6 | 7 | FROM postgres:16-bookworm 8 | 9 | RUN sed -i 's/$/ 13/' /etc/apt/sources.list.d/pgdg.list 10 | 11 | RUN set -eux; \ 12 | apt-get update; \ 13 | apt-get install -y --no-install-recommends \ 14 | postgresql-13='13.21-1.pgdg120+1' \ 15 | ; \ 16 | rm -rf /var/lib/apt/lists/* 17 | 18 | ENV PGBINOLD /usr/lib/postgresql/13/bin 19 | ENV PGBINNEW /usr/lib/postgresql/16/bin 20 | 21 | ENV PGDATAOLD /var/lib/postgresql/13/data 22 | ENV PGDATANEW /var/lib/postgresql/16/data 23 | 24 | RUN set -eux; \ 25 | mkdir -p "$PGDATAOLD" "$PGDATANEW"; \ 26 | chown -R postgres:postgres /var/lib/postgresql 27 | 28 | WORKDIR /var/lib/postgresql 29 | 30 | COPY docker-upgrade /usr/local/bin/ 31 | 32 | ENTRYPOINT ["docker-upgrade"] 33 | 34 | # recommended: --link 35 | CMD ["pg_upgrade"] 36 | -------------------------------------------------------------------------------- /13-to-16/docker-upgrade: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [ "$#" -eq 0 -o "${1:0:1}" = '-' ]; then 5 | set -- pg_upgrade "$@" 6 | fi 7 | 8 | if [ "$1" = 'pg_upgrade' -a "$(id -u)" = '0' ]; then 9 | mkdir -p "$PGDATAOLD" "$PGDATANEW" 10 | chmod 700 "$PGDATAOLD" "$PGDATANEW" 11 | chown postgres . 12 | chown -R postgres "$PGDATAOLD" "$PGDATANEW" 13 | exec gosu postgres "$BASH_SOURCE" "$@" 14 | fi 15 | 16 | if [ "$1" = 'pg_upgrade' ]; then 17 | if [ ! -s "$PGDATANEW/PG_VERSION" ]; then 18 | PGDATA="$PGDATANEW" eval "initdb $POSTGRES_INITDB_ARGS" 19 | fi 20 | fi 21 | 22 | exec "$@" 23 | -------------------------------------------------------------------------------- /13-to-17/Dockerfile: -------------------------------------------------------------------------------- 1 | # 2 | # NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh" 3 | # 4 | # PLEASE DO NOT EDIT IT DIRECTLY. 5 | # 6 | 7 | FROM postgres:17-bookworm 8 | 9 | RUN sed -i 's/$/ 13/' /etc/apt/sources.list.d/pgdg.list 10 | 11 | RUN set -eux; \ 12 | apt-get update; \ 13 | apt-get install -y --no-install-recommends \ 14 | postgresql-13='13.21-1.pgdg120+1' \ 15 | ; \ 16 | rm -rf /var/lib/apt/lists/* 17 | 18 | ENV PGBINOLD /usr/lib/postgresql/13/bin 19 | ENV PGBINNEW /usr/lib/postgresql/17/bin 20 | 21 | ENV PGDATAOLD /var/lib/postgresql/13/data 22 | ENV PGDATANEW /var/lib/postgresql/17/data 23 | 24 | RUN set -eux; \ 25 | mkdir -p "$PGDATAOLD" "$PGDATANEW"; \ 26 | chown -R postgres:postgres /var/lib/postgresql 27 | 28 | WORKDIR /var/lib/postgresql 29 | 30 | COPY docker-upgrade /usr/local/bin/ 31 | 32 | ENTRYPOINT ["docker-upgrade"] 33 | 34 | # recommended: --link 35 | CMD ["pg_upgrade"] 36 | -------------------------------------------------------------------------------- /13-to-17/docker-upgrade: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [ "$#" -eq 0 -o "${1:0:1}" = '-' ]; then 5 | set -- pg_upgrade "$@" 6 | fi 7 | 8 | if [ "$1" = 'pg_upgrade' -a "$(id -u)" = '0' ]; then 9 | mkdir -p "$PGDATAOLD" "$PGDATANEW" 10 | chmod 700 "$PGDATAOLD" "$PGDATANEW" 11 | chown postgres . 12 | chown -R postgres "$PGDATAOLD" "$PGDATANEW" 13 | exec gosu postgres "$BASH_SOURCE" "$@" 14 | fi 15 | 16 | if [ "$1" = 'pg_upgrade' ]; then 17 | if [ ! -s "$PGDATANEW/PG_VERSION" ]; then 18 | PGDATA="$PGDATANEW" eval "initdb $POSTGRES_INITDB_ARGS" 19 | fi 20 | fi 21 | 22 | exec "$@" 23 | -------------------------------------------------------------------------------- /14-to-15/Dockerfile: -------------------------------------------------------------------------------- 1 | # 2 | # NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh" 3 | # 4 | # PLEASE DO NOT EDIT IT DIRECTLY. 5 | # 6 | 7 | FROM postgres:15-bookworm 8 | 9 | RUN sed -i 's/$/ 14/' /etc/apt/sources.list.d/pgdg.list 10 | 11 | RUN set -eux; \ 12 | apt-get update; \ 13 | apt-get install -y --no-install-recommends \ 14 | postgresql-14='14.18-1.pgdg120+1' \ 15 | ; \ 16 | rm -rf /var/lib/apt/lists/* 17 | 18 | ENV PGBINOLD /usr/lib/postgresql/14/bin 19 | ENV PGBINNEW /usr/lib/postgresql/15/bin 20 | 21 | ENV PGDATAOLD /var/lib/postgresql/14/data 22 | ENV PGDATANEW /var/lib/postgresql/15/data 23 | 24 | RUN set -eux; \ 25 | mkdir -p "$PGDATAOLD" "$PGDATANEW"; \ 26 | chown -R postgres:postgres /var/lib/postgresql 27 | 28 | WORKDIR /var/lib/postgresql 29 | 30 | COPY docker-upgrade /usr/local/bin/ 31 | 32 | ENTRYPOINT ["docker-upgrade"] 33 | 34 | # recommended: --link 35 | CMD ["pg_upgrade"] 36 | -------------------------------------------------------------------------------- /14-to-15/docker-upgrade: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [ "$#" -eq 0 -o "${1:0:1}" = '-' ]; then 5 | set -- pg_upgrade "$@" 6 | fi 7 | 8 | if [ "$1" = 'pg_upgrade' -a "$(id -u)" = '0' ]; then 9 | mkdir -p "$PGDATAOLD" "$PGDATANEW" 10 | chmod 700 "$PGDATAOLD" "$PGDATANEW" 11 | chown postgres . 12 | chown -R postgres "$PGDATAOLD" "$PGDATANEW" 13 | exec gosu postgres "$BASH_SOURCE" "$@" 14 | fi 15 | 16 | if [ "$1" = 'pg_upgrade' ]; then 17 | if [ ! -s "$PGDATANEW/PG_VERSION" ]; then 18 | PGDATA="$PGDATANEW" eval "initdb $POSTGRES_INITDB_ARGS" 19 | fi 20 | fi 21 | 22 | exec "$@" 23 | -------------------------------------------------------------------------------- /14-to-16/Dockerfile: -------------------------------------------------------------------------------- 1 | # 2 | # NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh" 3 | # 4 | # PLEASE DO NOT EDIT IT DIRECTLY. 5 | # 6 | 7 | FROM postgres:16-bookworm 8 | 9 | RUN sed -i 's/$/ 14/' /etc/apt/sources.list.d/pgdg.list 10 | 11 | RUN set -eux; \ 12 | apt-get update; \ 13 | apt-get install -y --no-install-recommends \ 14 | postgresql-14='14.18-1.pgdg120+1' \ 15 | ; \ 16 | rm -rf /var/lib/apt/lists/* 17 | 18 | ENV PGBINOLD /usr/lib/postgresql/14/bin 19 | ENV PGBINNEW /usr/lib/postgresql/16/bin 20 | 21 | ENV PGDATAOLD /var/lib/postgresql/14/data 22 | ENV PGDATANEW /var/lib/postgresql/16/data 23 | 24 | RUN set -eux; \ 25 | mkdir -p "$PGDATAOLD" "$PGDATANEW"; \ 26 | chown -R postgres:postgres /var/lib/postgresql 27 | 28 | WORKDIR /var/lib/postgresql 29 | 30 | COPY docker-upgrade /usr/local/bin/ 31 | 32 | ENTRYPOINT ["docker-upgrade"] 33 | 34 | # recommended: --link 35 | CMD ["pg_upgrade"] 36 | -------------------------------------------------------------------------------- /14-to-16/docker-upgrade: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [ "$#" -eq 0 -o "${1:0:1}" = '-' ]; then 5 | set -- pg_upgrade "$@" 6 | fi 7 | 8 | if [ "$1" = 'pg_upgrade' -a "$(id -u)" = '0' ]; then 9 | mkdir -p "$PGDATAOLD" "$PGDATANEW" 10 | chmod 700 "$PGDATAOLD" "$PGDATANEW" 11 | chown postgres . 12 | chown -R postgres "$PGDATAOLD" "$PGDATANEW" 13 | exec gosu postgres "$BASH_SOURCE" "$@" 14 | fi 15 | 16 | if [ "$1" = 'pg_upgrade' ]; then 17 | if [ ! -s "$PGDATANEW/PG_VERSION" ]; then 18 | PGDATA="$PGDATANEW" eval "initdb $POSTGRES_INITDB_ARGS" 19 | fi 20 | fi 21 | 22 | exec "$@" 23 | -------------------------------------------------------------------------------- /14-to-17/Dockerfile: -------------------------------------------------------------------------------- 1 | # 2 | # NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh" 3 | # 4 | # PLEASE DO NOT EDIT IT DIRECTLY. 5 | # 6 | 7 | FROM postgres:17-bookworm 8 | 9 | RUN sed -i 's/$/ 14/' /etc/apt/sources.list.d/pgdg.list 10 | 11 | RUN set -eux; \ 12 | apt-get update; \ 13 | apt-get install -y --no-install-recommends \ 14 | postgresql-14='14.18-1.pgdg120+1' \ 15 | ; \ 16 | rm -rf /var/lib/apt/lists/* 17 | 18 | ENV PGBINOLD /usr/lib/postgresql/14/bin 19 | ENV PGBINNEW /usr/lib/postgresql/17/bin 20 | 21 | ENV PGDATAOLD /var/lib/postgresql/14/data 22 | ENV PGDATANEW /var/lib/postgresql/17/data 23 | 24 | RUN set -eux; \ 25 | mkdir -p "$PGDATAOLD" "$PGDATANEW"; \ 26 | chown -R postgres:postgres /var/lib/postgresql 27 | 28 | WORKDIR /var/lib/postgresql 29 | 30 | COPY docker-upgrade /usr/local/bin/ 31 | 32 | ENTRYPOINT ["docker-upgrade"] 33 | 34 | # recommended: --link 35 | CMD ["pg_upgrade"] 36 | -------------------------------------------------------------------------------- /14-to-17/docker-upgrade: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [ "$#" -eq 0 -o "${1:0:1}" = '-' ]; then 5 | set -- pg_upgrade "$@" 6 | fi 7 | 8 | if [ "$1" = 'pg_upgrade' -a "$(id -u)" = '0' ]; then 9 | mkdir -p "$PGDATAOLD" "$PGDATANEW" 10 | chmod 700 "$PGDATAOLD" "$PGDATANEW" 11 | chown postgres . 12 | chown -R postgres "$PGDATAOLD" "$PGDATANEW" 13 | exec gosu postgres "$BASH_SOURCE" "$@" 14 | fi 15 | 16 | if [ "$1" = 'pg_upgrade' ]; then 17 | if [ ! -s "$PGDATANEW/PG_VERSION" ]; then 18 | PGDATA="$PGDATANEW" eval "initdb $POSTGRES_INITDB_ARGS" 19 | fi 20 | fi 21 | 22 | exec "$@" 23 | -------------------------------------------------------------------------------- /15-to-16/Dockerfile: -------------------------------------------------------------------------------- 1 | # 2 | # NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh" 3 | # 4 | # PLEASE DO NOT EDIT IT DIRECTLY. 5 | # 6 | 7 | FROM postgres:16-bookworm 8 | 9 | RUN sed -i 's/$/ 15/' /etc/apt/sources.list.d/pgdg.list 10 | 11 | RUN set -eux; \ 12 | apt-get update; \ 13 | apt-get install -y --no-install-recommends \ 14 | postgresql-15='15.13-1.pgdg120+1' \ 15 | ; \ 16 | rm -rf /var/lib/apt/lists/* 17 | 18 | ENV PGBINOLD /usr/lib/postgresql/15/bin 19 | ENV PGBINNEW /usr/lib/postgresql/16/bin 20 | 21 | ENV PGDATAOLD /var/lib/postgresql/15/data 22 | ENV PGDATANEW /var/lib/postgresql/16/data 23 | 24 | RUN set -eux; \ 25 | mkdir -p "$PGDATAOLD" "$PGDATANEW"; \ 26 | chown -R postgres:postgres /var/lib/postgresql 27 | 28 | WORKDIR /var/lib/postgresql 29 | 30 | COPY docker-upgrade /usr/local/bin/ 31 | 32 | ENTRYPOINT ["docker-upgrade"] 33 | 34 | # recommended: --link 35 | CMD ["pg_upgrade"] 36 | -------------------------------------------------------------------------------- /15-to-16/docker-upgrade: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [ "$#" -eq 0 -o "${1:0:1}" = '-' ]; then 5 | set -- pg_upgrade "$@" 6 | fi 7 | 8 | if [ "$1" = 'pg_upgrade' -a "$(id -u)" = '0' ]; then 9 | mkdir -p "$PGDATAOLD" "$PGDATANEW" 10 | chmod 700 "$PGDATAOLD" "$PGDATANEW" 11 | chown postgres . 12 | chown -R postgres "$PGDATAOLD" "$PGDATANEW" 13 | exec gosu postgres "$BASH_SOURCE" "$@" 14 | fi 15 | 16 | if [ "$1" = 'pg_upgrade' ]; then 17 | if [ ! -s "$PGDATANEW/PG_VERSION" ]; then 18 | PGDATA="$PGDATANEW" eval "initdb $POSTGRES_INITDB_ARGS" 19 | fi 20 | fi 21 | 22 | exec "$@" 23 | -------------------------------------------------------------------------------- /15-to-17/Dockerfile: -------------------------------------------------------------------------------- 1 | # 2 | # NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh" 3 | # 4 | # PLEASE DO NOT EDIT IT DIRECTLY. 5 | # 6 | 7 | FROM postgres:17-bookworm 8 | 9 | RUN sed -i 's/$/ 15/' /etc/apt/sources.list.d/pgdg.list 10 | 11 | RUN set -eux; \ 12 | apt-get update; \ 13 | apt-get install -y --no-install-recommends \ 14 | postgresql-15='15.13-1.pgdg120+1' \ 15 | ; \ 16 | rm -rf /var/lib/apt/lists/* 17 | 18 | ENV PGBINOLD /usr/lib/postgresql/15/bin 19 | ENV PGBINNEW /usr/lib/postgresql/17/bin 20 | 21 | ENV PGDATAOLD /var/lib/postgresql/15/data 22 | ENV PGDATANEW /var/lib/postgresql/17/data 23 | 24 | RUN set -eux; \ 25 | mkdir -p "$PGDATAOLD" "$PGDATANEW"; \ 26 | chown -R postgres:postgres /var/lib/postgresql 27 | 28 | WORKDIR /var/lib/postgresql 29 | 30 | COPY docker-upgrade /usr/local/bin/ 31 | 32 | ENTRYPOINT ["docker-upgrade"] 33 | 34 | # recommended: --link 35 | CMD ["pg_upgrade"] 36 | -------------------------------------------------------------------------------- /15-to-17/docker-upgrade: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [ "$#" -eq 0 -o "${1:0:1}" = '-' ]; then 5 | set -- pg_upgrade "$@" 6 | fi 7 | 8 | if [ "$1" = 'pg_upgrade' -a "$(id -u)" = '0' ]; then 9 | mkdir -p "$PGDATAOLD" "$PGDATANEW" 10 | chmod 700 "$PGDATAOLD" "$PGDATANEW" 11 | chown postgres . 12 | chown -R postgres "$PGDATAOLD" "$PGDATANEW" 13 | exec gosu postgres "$BASH_SOURCE" "$@" 14 | fi 15 | 16 | if [ "$1" = 'pg_upgrade' ]; then 17 | if [ ! -s "$PGDATANEW/PG_VERSION" ]; then 18 | PGDATA="$PGDATANEW" eval "initdb $POSTGRES_INITDB_ARGS" 19 | fi 20 | fi 21 | 22 | exec "$@" 23 | -------------------------------------------------------------------------------- /16-to-17/Dockerfile: -------------------------------------------------------------------------------- 1 | # 2 | # NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh" 3 | # 4 | # PLEASE DO NOT EDIT IT DIRECTLY. 5 | # 6 | 7 | FROM postgres:17-bookworm 8 | 9 | RUN sed -i 's/$/ 16/' /etc/apt/sources.list.d/pgdg.list 10 | 11 | RUN set -eux; \ 12 | apt-get update; \ 13 | apt-get install -y --no-install-recommends \ 14 | postgresql-16='16.9-1.pgdg120+1' \ 15 | ; \ 16 | rm -rf /var/lib/apt/lists/* 17 | 18 | ENV PGBINOLD /usr/lib/postgresql/16/bin 19 | ENV PGBINNEW /usr/lib/postgresql/17/bin 20 | 21 | ENV PGDATAOLD /var/lib/postgresql/16/data 22 | ENV PGDATANEW /var/lib/postgresql/17/data 23 | 24 | RUN set -eux; \ 25 | mkdir -p "$PGDATAOLD" "$PGDATANEW"; \ 26 | chown -R postgres:postgres /var/lib/postgresql 27 | 28 | WORKDIR /var/lib/postgresql 29 | 30 | COPY docker-upgrade /usr/local/bin/ 31 | 32 | ENTRYPOINT ["docker-upgrade"] 33 | 34 | # recommended: --link 35 | CMD ["pg_upgrade"] 36 | -------------------------------------------------------------------------------- /16-to-17/docker-upgrade: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [ "$#" -eq 0 -o "${1:0:1}" = '-' ]; then 5 | set -- pg_upgrade "$@" 6 | fi 7 | 8 | if [ "$1" = 'pg_upgrade' -a "$(id -u)" = '0' ]; then 9 | mkdir -p "$PGDATAOLD" "$PGDATANEW" 10 | chmod 700 "$PGDATAOLD" "$PGDATANEW" 11 | chown postgres . 12 | chown -R postgres "$PGDATAOLD" "$PGDATANEW" 13 | exec gosu postgres "$BASH_SOURCE" "$@" 14 | fi 15 | 16 | if [ "$1" = 'pg_upgrade' ]; then 17 | if [ ! -s "$PGDATANEW/PG_VERSION" ]; then 18 | PGDATA="$PGDATANEW" eval "initdb $POSTGRES_INITDB_ARGS" 19 | fi 20 | fi 21 | 22 | exec "$@" 23 | -------------------------------------------------------------------------------- /Dockerfile.template: -------------------------------------------------------------------------------- 1 | FROM {{ .from }} 2 | 3 | RUN sed -i 's/$/ {{ .old }}/' /etc/apt/sources.list.d/pgdg.list 4 | 5 | RUN set -eux; \ 6 | apt-get update; \ 7 | apt-get install -y --no-install-recommends \ 8 | postgresql-{{ .old }}={{ .version | @sh }} \ 9 | ; \ 10 | rm -rf /var/lib/apt/lists/* 11 | 12 | ENV PGBINOLD /usr/lib/postgresql/{{ .old }}/bin 13 | ENV PGBINNEW /usr/lib/postgresql/{{ .new }}/bin 14 | 15 | ENV PGDATAOLD /var/lib/postgresql/{{ .old }}/data 16 | ENV PGDATANEW /var/lib/postgresql/{{ .new }}/data 17 | 18 | RUN set -eux; \ 19 | mkdir -p "$PGDATAOLD" "$PGDATANEW"; \ 20 | chown -R postgres:postgres /var/lib/postgresql 21 | 22 | WORKDIR /var/lib/postgresql 23 | 24 | COPY docker-upgrade /usr/local/bin/ 25 | 26 | ENTRYPOINT ["docker-upgrade"] 27 | 28 | # recommended: --link 29 | CMD ["pg_upgrade"] 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014-2015, Docker PostgreSQL Authors (See AUTHORS) 2 | 3 | Permission is hereby granted, free of charge, to any person 4 | obtaining a copy of this software and associated documentation 5 | files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, 7 | copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the 9 | Software is furnished to do so, subject to the following 10 | conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 17 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `pg_upgrade`, Docker style 2 | 3 | This is a PoC for using `pg_upgrade` inside Docker -- learn from it, adapt it for your needs; don't expect it to work as-is! 4 | 5 | (Source for this image is available at [https://github.com/tianon/docker-postgres-upgrade](https://github.com/tianon/docker-postgres-upgrade).) 6 | 7 | Tags of this image are of the format `OLD-to-NEW`, where `OLD` represents the version of PostgreSQL you are _currently_ running, and `NEW` represents the version of PostgreSQL you would like to upgrade to. 8 | 9 | In order to get good performance, it is recommended to run this image with `docker run image --link` (see [`pg_upgrade` documentation](https://www.postgresql.org/docs/9.5/static/pgupgrade.html) for more details). 10 | 11 | For this to be feasible, your directory structure should look something like this: (if yours does not, either adjust it, or scroll down to see the alternate pattern for running this image) 12 | 13 | ```console 14 | $ find DIR -mindepth 2 -maxdepth 2 15 | DIR/OLD/data 16 | DIR/NEW/data 17 | 18 | $ docker run --rm \ 19 | -v DIR:/var/lib/postgresql \ 20 | tianon/postgres-upgrade:OLD-to-NEW \ 21 | --link 22 | 23 | ... 24 | ``` 25 | 26 | More concretely, assuming `OLD` of `9.4`, `NEW` of `9.5`, and `DIR` of `/mnt/bigdrive/postgresql`: 27 | 28 | ```console 29 | $ find /mnt/bigdrive/postgresql -mindepth 2 -maxdepth 2 30 | /mnt/bigdrive/postgresql/9.4/data 31 | /mnt/bigdrive/postgresql/9.5/data 32 | 33 | $ docker run --rm \ 34 | -v /mnt/bigdrive/postgresql:/var/lib/postgresql \ 35 | tianon/postgres-upgrade:9.4-to-9.5 \ 36 | --link 37 | 38 | ... 39 | ``` 40 | 41 | (which assumes that your previous `postgres:9.4` instance was running with `-v /mnt/bigdrive/postgresql/9.4/data:/var/lib/postgresql/data`, and your new `postgres:9.5` instance will run with `-v /mnt/bigdrive/postgresql/9.5/data:/var/lib/postgresql/data`) 42 | 43 | --- 44 | 45 | If your two directories (denoted below as `PGDATAOLD` and `PGDATANEW`) do not follow this structure, then the following may also be used (but will be slower): 46 | 47 | ```console 48 | $ docker run --rm \ 49 | -v PGDATAOLD:/var/lib/postgresql/OLD/data \ 50 | -v PGDATANEW:/var/lib/postgresql/NEW/data \ 51 | tianon/postgres-upgrade:OLD-to-NEW 52 | 53 | ... 54 | ``` 55 | 56 | More concretely, assuming `OLD` of `9.4`, `NEW` of `9.5`, `PGDATAOLD` of `/mnt/bigdrive/postgresql-9.4`, and `PGDATANEW` of `/mnt/bigdrive/postgresql-9.5`: 57 | 58 | ```console 59 | $ docker run --rm \ 60 | -v /mnt/bigdrive/postgresql-9.4:/var/lib/postgresql/9.4/data \ 61 | -v /mnt/bigdrive/postgresql-9.5:/var/lib/postgresql/9.5/data \ 62 | tianon/postgres-upgrade:9.4-to-9.5 63 | 64 | ... 65 | ``` 66 | 67 | (which assumes that your previous `postgres:9.4` instance was running with `-v /mnt/bigdrive/postgresql-9.4:/var/lib/postgresql/data`, and your new `postgres:9.5` instance will run with `-v /mnt/bigdrive/postgresql-9.5:/var/lib/postgresql/data`) 68 | 69 | --- 70 | 71 | Putting it all together: 72 | 73 | ```console 74 | $ mkdir -p postgres-upgrade-testing 75 | $ cd postgres-upgrade-testing 76 | $ OLD='9.4' 77 | $ NEW='9.5' 78 | 79 | $ docker pull "postgres:$OLD" 80 | $ docker run -dit \ 81 | --name postgres-upgrade-testing \ 82 | -e POSTGRES_PASSWORD=password \ 83 | -v "$PWD/$OLD/data":/var/lib/postgresql/data \ 84 | "postgres:$OLD" 85 | $ sleep 5 86 | $ docker logs --tail 100 postgres-upgrade-testing 87 | 88 | $ # let's get some testing data in there 89 | $ docker exec -it \ 90 | -u postgres \ 91 | postgres-upgrade-testing \ 92 | pgbench -i -s 10 93 | 94 | $ docker stop postgres-upgrade-testing 95 | $ docker rm postgres-upgrade-testing 96 | 97 | $ docker run --rm \ 98 | -v "$PWD":/var/lib/postgresql \ 99 | "tianon/postgres-upgrade:$OLD-to-$NEW" \ 100 | --link 101 | 102 | $ docker pull "postgres:$NEW" 103 | $ docker run -dit \ 104 | --name postgres-upgrade-testing \ 105 | -e POSTGRES_PASSWORD=password \ 106 | -v "$PWD/$NEW/data":/var/lib/postgresql/data \ 107 | "postgres:$NEW" 108 | $ sleep 5 109 | $ docker logs --tail 100 postgres-upgrade-testing 110 | 111 | $ # can now safely remove "$OLD" 112 | $ sudo rm -rf "$OLD" 113 | ``` 114 | -------------------------------------------------------------------------------- /apply-templates.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -Eeuo pipefail 3 | 4 | [ -f versions.json ] # run "versions.sh" first 5 | 6 | jqt='.jq-template.awk' 7 | if [ -n "${BASHBREW_SCRIPTS:-}" ]; then 8 | jqt="$BASHBREW_SCRIPTS/jq-template.awk" 9 | elif [ "$BASH_SOURCE" -nt "$jqt" ]; then 10 | # https://github.com/docker-library/bashbrew/blob/master/scripts/jq-template.awk 11 | wget -qO "$jqt" 'https://github.com/docker-library/bashbrew/raw/9f6a35772ac863a0241f147c820354e4008edf38/scripts/jq-template.awk' 12 | fi 13 | 14 | if [ "$#" -eq 0 ]; then 15 | versions="$(jq -r 'keys_unsorted | map(@sh) | join(" ")' versions.json)" 16 | eval "set -- $versions" 17 | fi 18 | 19 | generated_warning() { 20 | cat <<-EOH 21 | # 22 | # NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh" 23 | # 24 | # PLEASE DO NOT EDIT IT DIRECTLY. 25 | # 26 | 27 | EOH 28 | } 29 | 30 | for version; do 31 | export version 32 | 33 | echo "processing $version ..." 34 | 35 | mkdir -p "$version" 36 | 37 | { 38 | generated_warning 39 | gawk -f "$jqt" Dockerfile.template 40 | } > "$version/Dockerfile" 41 | 42 | cp -a docker-upgrade "$version/" 43 | done 44 | -------------------------------------------------------------------------------- /docker-upgrade: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [ "$#" -eq 0 -o "${1:0:1}" = '-' ]; then 5 | set -- pg_upgrade "$@" 6 | fi 7 | 8 | if [ "$1" = 'pg_upgrade' -a "$(id -u)" = '0' ]; then 9 | mkdir -p "$PGDATAOLD" "$PGDATANEW" 10 | chmod 700 "$PGDATAOLD" "$PGDATANEW" 11 | chown postgres . 12 | chown -R postgres "$PGDATAOLD" "$PGDATANEW" 13 | exec gosu postgres "$BASH_SOURCE" "$@" 14 | fi 15 | 16 | if [ "$1" = 'pg_upgrade' ]; then 17 | if [ ! -s "$PGDATANEW/PG_VERSION" ]; then 18 | PGDATA="$PGDATANEW" eval "initdb $POSTGRES_INITDB_ARGS" 19 | fi 20 | fi 21 | 22 | exec "$@" 23 | -------------------------------------------------------------------------------- /generate-stackbrew-library.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -Eeuo pipefail 3 | 4 | self="$(basename "$BASH_SOURCE")" 5 | cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" 6 | 7 | if [ "$#" -eq 0 ]; then 8 | versions="$(jq -r 'keys_unsorted | map(@sh) | join(" ")' versions.json)" 9 | eval "set -- $versions" 10 | fi 11 | 12 | commit="$(git log -1 --format='format:%H' HEAD)" 13 | 14 | cat <<-EOH 15 | Maintainers: Tianon Gravi (@tianon) 16 | GitRepo: https://github.com/tianon/docker-postgres-upgrade.git 17 | GitCommit: $commit 18 | EOH 19 | 20 | for version; do 21 | export version 22 | 23 | cat <<-EOE 24 | 25 | Tags: $version 26 | Directory: $version 27 | EOE 28 | done 29 | -------------------------------------------------------------------------------- /update.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -Eeuo pipefail 3 | 4 | cd "$(dirname "$(readlink -f "$BASH_SOURCE")")" 5 | 6 | ./versions.sh "$@" 7 | ./apply-templates.sh "$@" 8 | -------------------------------------------------------------------------------- /versions.json: -------------------------------------------------------------------------------- 1 | { 2 | "16-to-17": { 3 | "from": "postgres:17-bookworm", 4 | "new": "17", 5 | "old": "16", 6 | "version": "16.9-1.pgdg120+1" 7 | }, 8 | "15-to-17": { 9 | "from": "postgres:17-bookworm", 10 | "new": "17", 11 | "old": "15", 12 | "version": "15.13-1.pgdg120+1" 13 | }, 14 | "14-to-17": { 15 | "from": "postgres:17-bookworm", 16 | "new": "17", 17 | "old": "14", 18 | "version": "14.18-1.pgdg120+1" 19 | }, 20 | "13-to-17": { 21 | "from": "postgres:17-bookworm", 22 | "new": "17", 23 | "old": "13", 24 | "version": "13.21-1.pgdg120+1" 25 | }, 26 | "15-to-16": { 27 | "from": "postgres:16-bookworm", 28 | "new": "16", 29 | "old": "15", 30 | "version": "15.13-1.pgdg120+1" 31 | }, 32 | "14-to-16": { 33 | "from": "postgres:16-bookworm", 34 | "new": "16", 35 | "old": "14", 36 | "version": "14.18-1.pgdg120+1" 37 | }, 38 | "13-to-16": { 39 | "from": "postgres:16-bookworm", 40 | "new": "16", 41 | "old": "13", 42 | "version": "13.21-1.pgdg120+1" 43 | }, 44 | "14-to-15": { 45 | "from": "postgres:15-bookworm", 46 | "new": "15", 47 | "old": "14", 48 | "version": "14.18-1.pgdg120+1" 49 | }, 50 | "13-to-15": { 51 | "from": "postgres:15-bookworm", 52 | "new": "15", 53 | "old": "13", 54 | "version": "13.21-1.pgdg120+1" 55 | }, 56 | "13-to-14": { 57 | "from": "postgres:14-bookworm", 58 | "new": "14", 59 | "old": "13", 60 | "version": "13.21-1.pgdg120+1" 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /versions.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -Eeuo pipefail 3 | 4 | doiCommit="$(git ls-remote https://github.com/docker-library/official-images.git HEAD | cut -d$'\t' -f1)" 5 | doiPostgres="https://github.com/docker-library/official-images/raw/$doiCommit/library/postgres" 6 | versions="$( 7 | bashbrew list "$doiPostgres" | jq -nR ' 8 | [ 9 | inputs 10 | # filter tags down to just "N-XXX" (capturing "version" and "debian suite") 11 | | capture(":(?[0-9]+)-(?[a-z].*)$") 12 | | select(.suite | startswith("alpine") | not) 13 | ] 14 | ' 15 | )" 16 | supportedVersions="$(jq <<<"$versions" -r '[ .[].version | tonumber ] | unique | reverse | map(@sh) | join(" ")')" 17 | eval "supportedVersions=( $supportedVersions )" 18 | 19 | json='{}' 20 | 21 | for i in "${!supportedVersions[@]}"; do 22 | new="${supportedVersions[$i]}" 23 | export new 24 | suites="$(jq <<<"$versions" -c '[ .[] | select(.version == env.new).suite ]')" 25 | echo "# $new (possible suites: $suites)" 26 | (( j = i + 1 )) 27 | for old in "${supportedVersions[@]:$j}"; do 28 | export old 29 | suite="$(jq <<<"$versions" --argjson suites "$suites" -r ' 30 | first( 31 | .[] 32 | | select( 33 | .version == env.old 34 | and ( 35 | .suite as $suite 36 | | $suites | index($suite) 37 | ) 38 | ) 39 | ).suite 40 | ')" 41 | from="postgres:$new-$suite" 42 | dir="$old-to-$new" 43 | export suite from dir 44 | echo "- $old -> $new ($dir; $suite)" 45 | postgresCommit="$(bashbrew cat --format '{{ .TagEntry.GitCommit }}' "$doiPostgres:$old-$suite")" 46 | versionsURL="https://github.com/docker-library/postgres/raw/$postgresCommit/versions.json" 47 | oldVersion="$(wget -qO- "$versionsURL" | jq -r '.[env.old][env.suite].version // empty')" # TODO arches? (would need to cross-reference $new's arches, but that's fair / not too difficult) 48 | echo " - $oldVersion" 49 | [ -n "$oldVersion" ] 50 | export oldVersion 51 | json="$(jq <<<"$json" -c ' 52 | .[env.dir] = { 53 | from: env.from, 54 | new: env.new, 55 | old: env.old, 56 | version: env.oldVersion, 57 | } 58 | ')" 59 | done 60 | done 61 | 62 | jq <<<"$json" '.' > versions.json 63 | --------------------------------------------------------------------------------