如何在 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 数据库