La documentación de la imagen Docker de postgres dice lo siguiente sobre el env var POSTGRES_DB :
Esta variable de entorno opcional se puede utilizar para definir un nombre diferente para la base de datos predeterminada que se crea cuando se inicia la imagen por primera vez. Si no se especifica, se utilizará el valor de POSTGRES_USER.
He descubierto que esto no es cierto en absoluto. Por ejemplo, con esta configuración:
version: '3.7' services: db: image: postgres:11.3-alpine restart: always container_name: store volumes: - postgres_data:/var/lib/postgresql/data/ ports: - 5432:5432 environment: - POSTGRES_USER=custom - POSTGRES_DB=customname - POSTGRES_PASSWORD_FILE=/run/secrets/db_password secrets: - db_password volumes: postgres_data: secrets: db_password: file: config/.secrets.db_password La base de datos predeterminada se llama postgres y no customname como he especificado:
$ docker exec -it store psql -U custom customname psql: FATAL: database customname does not exist $ docker exec -it store psql -U custom postgres psql (11.3) Type help for help. postgres=# ^D¿Me estoy perdiendo algo obvio?
Al proporcionar las variables de entorno, como lo hizo, customname crear la base de datos de nombre personalizado cuando se inicializa el contenedor. No es necesario crear el nombre de usuario y la base de datos en los scripts de inicio /docker-entrypoint-initdb.d/ .
Me aseguraría de que no haya ningún volumen postgres_data pendiente. Si anteriormente inició el contenedor sin especificar las variables de entorno, el volumen se crea para la base de datos postgres predeterminada. La próxima vez que inicie el contenedor (con el POSTGRES_DB especificado), se omitirá la parte de creación de la base de datos.
Solo para asegurarse, elimine cualquier volumen creado (el nombre debe ser algo como *_postgres_data )
docker volume ls docker volume rm <volume_name>Consulte que el usuario y la base de datos no se crearon también a partir de argumentos de variables de entorno . Espero que ayude
Primero debe crear la base de datos.
Si desea hacerlo automáticamente para nuevos directorios de datos, entonces la imagen oficial de Docker Postgres tiene una opción para hacerlo colocando scripts de inicialización con la extensión .sql en el directorio /docker-entrypoint-initdb.d/ .
Por ejemplo, cree un archivo con contenidos como:
CREATE USER custom_user; CREATE DATABASE custom_db; GRANT ALL PRIVILEGES ON DATABASE custom_db TO custom_user; Y guárdelo en /docker-entrypoint-initdb.d/create-db.sql en el contenedor, por ejemplo, con COPY en Dockerfile . Los scripts con la extensión .sql dentro de ese directorio solo se ejecutarán si el directorio DATA está vacío y se ejecutarán varios archivos en el orden alfabético de los nombres de los archivos.
Si desea configurarlo manualmente, también puede hacerlo con la utilidad createdb
createdb [connection-option...] [option...] [dbname [description]] O conectándose a la base de datos de postgres y usando el comando CREATE DATABASE ... , por ejemplo
docker exec -it store psql -U postgres -c 'CREATE DATABASE customname;'Si se conecta de forma interactiva como en su pregunta, puede hacer lo siguiente:
$ docker exec -it store psql -U postgres psql (11.3) Type help for help. postgres=# CREATE DATABASE customname; CREATE DATABASE postgres=# \c customname El último comando lo conectará a la customname datos de nombre personalizado.
Si ha cambiado el nombre de usuario/contraseña desde la primera ejecución, intente eliminar el volumen anterior creado
docker volume rm <volume-name>Luego ejecute el archivo de redacción nuevamente