usar pg_upgrade quando você instalou a versão 'antiga' e a versão 'nova' em um sistema é bem direto. Eu tentei encontrar uma maneira de usar pg_upgrade com contêineres docker. Isso é um pouco mais complicado porque você precisa do 'antigo datadir', do 'antigo bindir' e do 'novo datadir' e do 'novo bindir' da versão 'antiga' e da 'nova' do postgres que você quer atualizar e atualizar para. Como os 'diretórios antigos' não estão presentes no contêiner docker da versão 'nova', você tem que montá-los no contêiner 'novo'.
Mas como o pg_upgrade parece esperar não apenas o bindir e o datadir 'antigos', mas também as bibliotecas 'antigas' (das quais o postgres depende) da versão mais antiga, você também precisa montá-las no contêiner da nova versão.
Então acabei executando um 'old-version-container', copiando o bindir, datadir e lib dir para o host docker local e montando-os no 'new-version-container'
ao vir do postgres-12, isso significa copiar o conteúdo de /usr/lib/ para o host docker local e remontá-lo para o 'new-version-container'
então montei o 'old-libdir' em /12-bindir/ e fiz
ldd /12-bindir/postgres
para descobrir de quais libs o postgres depende. Depois de copiar o 'old-libs' para /usr/lib no 'new-version-container' todas as dependências puderam ser encontradas e eu consegui usar o pg_upgrade e realmente atualizar um banco de dados de (ou seja, postgres-12-alpine para postgres:15.10-bookworm)
então... funcionou... Então... a verdadeira questão é: porque funciona... devo fazer assim ou estou esquecendo de algo e fazendo algo estúpido ou bobo? Fico feliz com cada dica e opinião
Não acho que você tenha feito nada bobo. Atualizar com contêineres apresenta dificuldade adicional. Eu diria que você deve fazer um dos seguintes, se tiver que fazer isso com mais frequência:
crie um contêiner especial para atualização com ambos os binários nele
monte os volumes fora de um contêiner e atualize lá