gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:58:30 25 4
gpt4 key购买 nike

我正在尝试创建一个数据库并在我的容器网络中连接到它。我不想通过 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

这是我的 init.sql 文件:

CREATE DATABASE web;
CREATE USER docker WITH PASSWORD 'password';
GRANT ALL PRIVILEGES ON DATABASE web TO docker;

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

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

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

CREATE ROLE docker with SUPERUSER PASSWORD password;
GRANT web TO docker;

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

Error: connect ECONNREFUSED

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

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

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

提前谢谢你。

最佳答案

How can I create a database using only the files in my project (i.e. no manual commands)?

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

postgres:
image: postgres:9.4
environment:
- POSTGRES_DB=web
- POSTGRES_USER=myuser

How do I create a user/role using only the files in my project?

要在数据库初始化时执行脚本,请查看 official docs for 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

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

volumes:
- .:/docker-entrypoint-initdb.d

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

How do I connect to this database?

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

docker exec -ti folder_postgres_1 psql -U myuser -d web

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

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.

Dockerfile:

FROM postgres:latest

# ...
COPY *.sh /docker-entrypoint-initdb.d/
# ...

关于postgresql - 如何仅使用 docker-compose 文件在 docker 容器中创建数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49024243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com