如何在Docker中为Postgres运行sql脚本?

时间:2017-03-22 21:48:06

标签: node.js postgresql docker docker-compose

我正在关注此帖子以运行SQL脚本来创建默认表。

这是我的docker撰写文件

version: "3"
services:
  web:
    build: .
    volumes:
      - ./:/usr/src/app/
      - /usr/src/app/node_modules
    ports:
      - “3000:3000”
    depends_on:
      - postgres
  postgres:
    container_name: postgres
    build:
      context: .
      dockerfile: pgDockerfile
    environment:
      POSTGRES_PASSWORD: test
      POSTGRES_USER: test
    ports:
      - 5432:5432

这是我的pgDockerfile

FROM postgres:9.6-alpine

# copy init sql
ADD 00-initial.sql /docker-entrypoint-initdb.d/

这是我的sql脚本

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE IF NOT EXISTS test (
    id text NOT NULL,
    title varchar(200) NOT NULL
);

我可以构建并运行docker-compose up,我看到以下消息:

postgres    | CREATE DATABASE
postgres    | 
postgres    | CREATE ROLE
postgres    | 
postgres    | 
postgres    | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/00-initial-data.sql
postgres    | CREATE EXTENSION
postgres    | CREATE TABLE
postgres    | 
postgres    | 
postgres    | LOG:  received fast shutdown request
postgres    | LOG:  aborting any active transactions
postgres    | waiting for server to shut down....LOG:  autovacuum launcher shutting down
postgres    | LOG:  shutting down
postgres    | LOG:  database system is shut down
postgres    |  done
postgres    | server stopped
postgres    | 
postgres    | PostgreSQL init process complete; ready for start up.
postgres    | 
postgres    | LOG:  database system was shut down at 2017-03-22 21:36:16 UTC
postgres    | LOG:  MultiXact member wraparound protections are now enabled
postgres    | LOG:  database system is ready to accept connections
postgres    | LOG:  autovacuum launcher started

在创建表之后,似乎关闭了db。我认为这是Postgres Docker的标准流程,但是当我登录Postgres时,我看不到我的桌子应该在那里。

我通过

登录
docker exec -it $(my postgres container id) sh

#su - postgres

#psql

# \d => No relations found. 

我不确定这是否是为Postgres创建默认数据的正确方法。

1 个答案:

答案 0 :(得分:0)

我认为您的泊坞窗可以按预期工作,但是并没有完全按照您的想法进行。设置POSTGRES_USER而不设置POSTGRES_DB时,系统将默认使用用户名作为数据库名,因此您的表位于test数据库中!

使用\l列出数据库将显示数据库,然后您可以使用\c test连接到数据库。建立连接后,\d将列出您的关系!