我正在尝试创建一个数据库并在我的容器网络中连接到它。我不想通过 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 服务还没有启动,连接怎么会被拒绝呢??
简而言之,这些是我试图解决的问题:
先感谢您。
如何仅使用项目中的文件(即没有手动命令)创建数据库?
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 stop
与docker 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)
归档时间: |
|
查看次数: |
10489 次 |
最近记录: |