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

Posted

技术标签:

【中文标题】如何在 Docker 中为 Postgres 运行 sql 脚本?【英文标题】:How to run sql script for Postgres in Docker? 【发布时间】:2017-08-15 06:05:36 【问题描述】:

我正在关注这篇文章来运行 SQL 脚本来创建默认表。

这是我的 docker compose 文件

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

似乎在创建表后数据库已关闭。我认为这是 Postgres Docker 的标准流程,但是当我登录 Postgres 时,我看不到我应该在那里的表。

我通过

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

#su - postgres

#psql

# \d => No relations found. 

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

【问题讨论】:

你的脚本被执行了,查看官方图像文档我找到了 POSTGRES_DB 参数,也许你需要设置这个。在 docker-compose 和 dockerfile 上查看您的配置,我看不出有什么问题。 【参考方案1】:

我认为您的 docker 按预期工作,但并没有完全按照您的想法进行。当设置POSTGRES_USER而不是POSTGRES_DB时,系统会默认使用用户名作为数据库名,所以你的表在test数据库中!

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

【讨论】:

以上是关于如何在 Docker 中为 Postgres 运行 sql 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Postgres 中为 UUID 主键列设置默认值?

如何将节点 docker 容器与 postgres docker 容器连接起来

docker安装postgres镜像&&如何通过Dockerfile使之在运行镜像时初始化数据

如何在 docker-compose 中访问 Postgres 数据库

在 Node.js 中为 postgres 表中的每一行以不同的间隔为每一行运行重复任务

如何使用 docker-compose 在 docker 容器中为 Laravel 环境安装 Behat?