首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Docker Postgres的脚本中创建用户/数据库

如何在Docker Postgres的脚本中创建用户/数据库
EN

Stack Overflow用户
提问于 2014-10-28 07:47:59
回答 8查看 313.4K关注 0票数 285

我一直在尝试通过创建自定义用户和数据库来为开发postgres实例设置容器。我正在使用official postgres docker image。在文档中,它指示您在/docker-entrypoint-initdb.d/文件夹中插入一个bash脚本,以使用任何自定义参数设置数据库。

我的bash脚本: make_db.sh

代码语言:javascript
复制
su postgres -c "createuser -w -d -r -s docker"
su postgres -c "createdb -O docker docker"

Dockerfile

代码语言:javascript
复制
FROM library/postgres

RUN ["mkdir", "/docker-entrypoint-initdb.d"]
ADD make_db.sh /docker-entrypoint-initdb.d/

我从docker logs -f db (db是我的容器名称)得到的错误是:

创建用户:无法连接到数据库postgres:无法连接到服务器:没有这样的文件或目录

/docker-entrypoint-initdb.d/文件夹中的命令似乎是在postgres启动之前执行的。我的问题是,如何使用官方postgres容器以编程方式设置用户/数据库?有没有办法用脚本做到这一点呢?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2014-10-28 08:58:39

编辑-自2015年7月23日起

official postgres docker image将运行/docker-entrypoint-initdb.d/文件夹中的.sql脚本。

因此,您所需要做的就是创建以下sql脚本:

init.sql

代码语言:javascript
复制
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;

并将其添加到Dockerfile中:

Dockerfile

代码语言:javascript
复制
FROM library/postgres
COPY init.sql /docker-entrypoint-initdb.d/

但是从2015年7月8日起,如果您只需要创建一个用户和数据库,那么只使用POSTGRES_USERPOSTGRES_PASSWORDPOSTGRES_DB环境变量就更容易了:

代码语言:javascript
复制
docker run -e POSTGRES_USER=docker -e POSTGRES_PASSWORD=docker -e POSTGRES_DB=docker library/postgres

或者使用Dockerfile:

代码语言:javascript
复制
FROM library/postgres
ENV POSTGRES_USER docker
ENV POSTGRES_PASSWORD docker
ENV POSTGRES_DB docker

对于2015年7月23日之前的图像

来自the documentation of the postgres Docker image的说法是

...在启动服务之前,它将查找在目录/docker-entrypoint-initdb.d中找到任何*.sh脚本以执行进一步的初始化

这里最重要的是“在启动服务之前”。这意味着您的脚本make_db.sh将在postgres服务启动之前执行,因此会出现错误消息“无法连接到数据库postgres”。

在此之后,还有一条有用的信息:

如果您需要执行SQL命令作为初始化的一部分,强烈建议使用Postgres单用户模式。

我同意,乍一看这可能有点神秘。它说的是,您的初始化脚本应该在执行操作之前以单模式启动postgres服务。因此,您可以按如下方式更改您的make_db.ksh脚本,这将使您更接近您想要的内容:

注意到,这最近发生了变化,in the following commit。这将适用于最新的更改:

代码语言:javascript
复制
export PGUSER=postgres
psql <<- EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL

以前,需要使用--single模式:

代码语言:javascript
复制
gosu postgres postgres --single <<- EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL
票数 485
EN

Stack Overflow用户

发布于 2019-10-12 01:48:26

通过使用docker-compose

假设您有以下目录布局:

代码语言:javascript
复制
$MYAPP_ROOT/docker-compose.yml
           /Docker/init.sql
           /Docker/db.Dockerfile

文件:docker-compose.yml

代码语言:javascript
复制
version: "3.3"
services:
  db:
    build:
      context: ./Docker
      dockerfile: db.Dockerfile
    volumes:
      - ./var/pgdata:/var/lib/postgresql/data
    ports:
      - "5432:5432"

文件:Docker/init.sql

代码语言:javascript
复制
CREATE USER myUser;

CREATE DATABASE myApp_dev;
GRANT ALL PRIVILEGES ON DATABASE myApp_dev TO myUser;

CREATE DATABASE myApp_test;
GRANT ALL PRIVILEGES ON DATABASE myApp_test TO myUser;

文件:Docker/db.Dockerfile

代码语言:javascript
复制
FROM postgres:11.5-alpine
COPY init.sql /docker-entrypoint-initdb.d/

组成和启动服务:

代码语言:javascript
复制
docker-compose -f docker-compose.yml up --no-start
docker-compose -f docker-compose.yml start
票数 31
EN

Stack Overflow用户

发布于 2020-05-11 19:54:55

使用docker compose有一个简单的替代方案(不需要创建Dockerfile)。只需创建一个init-database.sh:

代码语言:javascript
复制
#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE USER docker;
    CREATE DATABASE my_project_development;
    GRANT ALL PRIVILEGES ON DATABASE my_project_development TO docker;
    CREATE DATABASE my_project_test;
    GRANT ALL PRIVILEGES ON DATABASE my_project_test TO docker;
EOSQL

并在volumes部分中引用它:

代码语言:javascript
复制
version: '3.4'

services:
  postgres:
    image: postgres
    restart: unless-stopped
    volumes:
      - postgres:/var/lib/postgresql/data
      - ./init-database.sh:/docker-entrypoint-initdb.d/init-database.sh
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - 5432:5432

volumes:
  postgres:
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26598738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档