首页 > 解决方案 > Docker postgreSQL entrypoint-initdb.d 选择数据库

问题描述

我有一个docker-compose.yml文件

version: '3'

services:
  postgres:
    image: postgres:13.1
    healthcheck:
      test: [ "CMD", "pg_isready", "-q", "-d", "postgres", "-U", "root" ]
      timeout: 45s
      interval: 10s
      retries: 10
    restart: always
    environment:
      - POSTGRES_USER=root
      - POSTGRES_PASSWORD=password
      - APP_DB_USER=docker
      - APP_DB_PASS=docker
      - APP_DB_NAME=docker
    volumes:
      - ./db:/docker-entrypoint-initdb.d/
    ports:
      - 5432:5432

在同一目录中有一个db包含 1 个文件的目录init.sql

CREATE TABLE accounts (
    user_id serial PRIMARY KEY,
    username VARCHAR ( 50 ) UNIQUE NOT NULL,
    password VARCHAR ( 50 ) NOT NULL,
    email VARCHAR ( 255 ) UNIQUE NOT NULL,
    created_on TIMESTAMP NOT NULL,
        last_login TIMESTAMP 
);

insert into accounts(username,password,email,created_on) values ('a','aaa','assdfdas',now())

当我运行时docker-compose up(如果数据库为空),init.sql文件被执行,但执行它的数据库root不是postgres,我该如何更改它?

指向 DataGrip 屏幕截图的 Imgur 链接

标签: postgresqldockerdocker-compose

解决方案


\connect <db-name>您可以在文件中使用 psql 命令init.sql来连接到正确的数据库(假设数据库已经存在)。

在您的情况下,该init.sql文件将类似于:

\connect postgres   <-- connects to the 'postgres' database

CREATE TABLE accounts (
    user_id serial PRIMARY KEY,
    username VARCHAR ( 50 ) UNIQUE NOT NULL,
    password VARCHAR ( 50 ) NOT NULL,
    email VARCHAR ( 255 ) UNIQUE NOT NULL,
    created_on TIMESTAMP NOT NULL,
        last_login TIMESTAMP 
);
...

推荐阅读