docker-library / postgres

Docker Official Image packaging for Postgres
http://www.postgresql.org
MIT License
2.14k stars 1.11k forks source link

Initialization script when PGData is not empty #1229

Open tomera-cyera opened 2 months ago

tomera-cyera commented 2 months ago

I know that when the PGData directory is not empty the container skips the initialization and therefore won't run the initialization script in /docker-entrypoint-initdb.d

I would like to use a way to give the container scripts that will run on startup no matter what (for example to create a role postgres if one does not exist already)

tianon commented 2 months ago

If you want a solution that does something with a started database (like our existing initdb scripts do), see https://github.com/docker-library/postgres/issues/173, https://github.com/docker-library/postgres/issues/821, https://github.com/docker-library/postgres/issues/191, https://github.com/docker-library/postgres/issues/929 for some other issues that have some good thoughts / suggestions (one of which this is probably a duplicate of).

tomera-cyera commented 2 months ago

Hi @tianon! Thanks for your response. I managed to run an init script on my db but it fails with role "postgres" does not exist (it was probably deleted). I don't know what roles the db has and I want to use the init script to verify the postgres role exists (and if not to create one).

LaurentGoderre commented 2 months ago

You can run

docker exec -u postgres -it postgres psql    
psql (16.2 (Debian 16.2-1.pgdg120+2))
Type "help" for help.

postgres=# \du
                             List of roles
 Role name |                         Attributes                         
-----------+------------------------------------------------------------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS
tomera-cyera commented 2 months ago

Hi @LaurentGoderre unfortunately your solution would not work in my case because there is no role postgres so I'm unable to execute any command with -u postgres, that's why I would like to init the db with a postgres role creation

LaurentGoderre commented 2 months ago

@tomera-cyera I believe postgres in this case refers to the OS user which is postgres not the db role.

tomera-cyera commented 2 months ago

No, I refer to the postgres db role in case I initialize the container with data-dir that does not have the role postgres I want to make sure the postgres role will be created if not exist @LaurentGoderre

LaurentGoderre commented 2 months ago

OOh you mean at initialization?

tomera-cyera commented 2 months ago

@LaurentGoderre, yes. you see I need to initialize the db to have a postgres role even when the datadir already exists (a.k.a the db already initialized)