A outra resposta de fato aponta para a causa raiz do problema, no entanto, a página de ajuda para a qual ela aponta não contém uma solução. Aqui está o que eu inventei para fazer isso funcionar para mim:
- inicie o contêiner usando seu arquivo de composição do docker normal, isso cria o diretório com o uid:gid (999:999) codificado permanentemente
version: '3.7'
services:
db:
image: postgres
container_name: postgres
volumes:
- ./data:/var/lib/postgresql/data
environment:
POSTGRES_USER: fake_database_user
POSTGRES_PASSWORD: fake_database_PASSWORD
- pare o contêiner e altere manualmente a propriedade para uid:gid que você deseja (vou usar 1000:1000 para este exemplo
$ docker stop postgres
$ sudo chown -R 1000:1000 ./data
- Edite seu arquivo docker para adicionar o uid:gid desejado e inicie-o novamente usando docker-compose (observe o
user:
)
version: '3.7'
services:
db:
image: postgres
container_name: postgres
volumes:
- ./data:/var/lib/postgresql/data
user: 1000:1000
environment:
POSTGRES_USER: fake_database_user
POSTGRES_PASSWORD: fake_database_password
A razão pela qual você não pode simplesmente usar
user:
desde o início é que, se a imagem for executada como um usuário diferente, ela falhará ao criar os arquivos de dados. Na página de documentação da imagem , ele menciona uma solução para adicionar um volume para expor o
/etc/passwd
arquivo como somente leitura na imagem ao fornecer --user
opção, no entanto, que não funcionou para mim com a imagem mais recente, pois estava recebendo o seguinte erro. Na verdade, nenhuma das três soluções propostas funcionou para mim. initdb: error: could not change permissions of directory "/var/lib/postgresql/data": Operation not permitted