如何仅使用 docker-compose 文件在 docker 容器中创建数据库?

dop*_*man 6 postgresql docker

我正在尝试创建一个数据库并在我的容器网络中连接到它。我不想通过 ssh 进入一个盒子来创建用户/数据库等,因为这不是一个可扩展或易于分发的过程。

这是我到目前为止:

# docker-compose.yml
db:
    image: postgres:9.4
    volumes:
      - ./db/init.sql:/docker-entrypoint-initdb/10-init.sql
    environment:
      - PGDATA=/tmp
      - PGDATABASE=web
      - PGUSER=docker
      - PGPASSWORD=password
Run Code Online (Sandbox Code Playgroud)

这是我的init.sql文件:

CREATE DATABASE web;
CREATE USER docker WITH PASSWORD 'password';
GRANT ALL PRIVILEGES ON DATABASE web TO docker;
Run Code Online (Sandbox Code Playgroud)

当我启动容器并尝试连接到它时,出现此错误:

db_1   | FATAL:  role "docker" does not exist
db_1   |  done
db_1   | server started
db_1   | FATAL:  database "web" does not exist
db_1   | psql: FATAL:  database "web" does not exist
Run Code Online (Sandbox Code Playgroud)

第一次发生这种情况时,我尝试创建一个这样的角色:

CREATE ROLE docker with SUPERUSER PASSWORD password;
GRANT web TO docker;
Run Code Online (Sandbox Code Playgroud)

但它没有任何效果。更令人困惑的是,当我使用node-postgres连接到数据库时,出现此错误:

Error: connect ECONNREFUSED
Run Code Online (Sandbox Code Playgroud)

但是如果 db 服务还没有启动,连接怎么会被拒绝呢??

简而言之,这些是我试图解决的问题:

  1. 如何仅使用项目中的文件(即没有手动命令)创建数据库?
  2. 如何仅使用项目中的文件创建用户/角色?
  3. 我如何连接到这个数据库?

先感谢您。

Yan*_*ann 7

如何仅使用项目中的文件(即没有手动命令)创建数据库?

docker-compose.yml您定义的用户和数据库的最小配置是:

postgres:
    image: postgres:9.4
    environment:
      - POSTGRES_DB=web
      - POSTGRES_USER=myuser
Run Code Online (Sandbox Code Playgroud)

如何仅使用项目中的文件创建用户/角色?

要在数据库初始化时执行脚本,请查看initdb官方文档。为了让您开始使用快速而肮脏的解决方案init_conf.sh,请在与您的相同目录中创建一个新文件docker-compose.yml

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 -U "$POSTGRES_USER" -d "$POSTGRES_DB" <<-EOSQL

    CREATE ROLE docker with SUPERUSER PASSWORD 'password';

EOSQL
Run Code Online (Sandbox Code Playgroud)

并将volumes指令添加到您的docker-compose.yml.

volumes:
  - .:/docker-entrypoint-initdb.d
Run Code Online (Sandbox Code Playgroud)

重新创建您的容器,否则您将不会触发新的数据库初始化。这意味着,docker stopdocker rm旧的第一执行前docker-compose up一次。STDOUT 现在为您提供有关我们新引入的脚本的一些信息。

我如何连接到这个数据库?

docker exec通过终端连接到您的数据库:

docker exec -ti folder_postgres_1 psql -U myuser -d web
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml我的其中一个生产环境中的A如下所示:

services:
  postgres:
    logging: &logging
      driver: json-file
      options:
        max-size: "10m"
        max-file: "5"
    build: ./docker/postgres  # path to custom Dockerfile
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - postgres_backup:/backups
    env_file: .env
    restart: always

  # ... other services like web, celery, redis, etc.
Run Code Online (Sandbox Code Playgroud)

Dockerfile

FROM postgres:latest

# ...
COPY *.sh /docker-entrypoint-initdb.d/
# ...
Run Code Online (Sandbox Code Playgroud)