我正在docker-compose环境中使用Postgres来托管多个容器的数据库。我基本上想直接从docker-compose为每个应用程序添加数据库,而无需手动创建数据库和用户。为此,我使用了Postgres docker映像的初始化脚本功能,并通过装入卷来复制以下bash脚本:
db:
image: postgres:9.6
container_name: db
restart: always
volumes:
- postgres-data:/var/lib/postgresql/data
- /opt/docker/pgsql-entrypoint:/docker-entrypoint-initdb.d
environment:
- POSTGRES_PASSWORD={{ vault_pgsql_root_password }}
- POSTGRES_MULTIPLE_DATABASES=confluence-{{ confluence_pgsql_password }},keycloak-{{ keycloak_pgsql_password }},gitlab-{{ gitlab_pgsql_password }},jira-{{ jira_pgsql_password }}
基本上POSTGRES_MULTIPLE_DATABASES
environment变量包含应创建的所有数据库和用户。密码如下:
#!/bin/bash
set -e
set -u
function create_user_and_database() {
local database=$1
local password=$2
echo " Creating user and database '$database'"
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
CREATE USER $database WITH PASSWORD '$password';
CREATE DATABASE $database;
GRANT ALL PRIVILEGES ON DATABASE $database TO $database;
EOSQL
}
if [ -n "$POSTGRES_MULTIPLE_DATABASES" ]; then
echo "Multiple database creation requested: $POSTGRES_MULTIPLE_DATABASES"
for entry in $(echo $POSTGRES_MULTIPLE_DATABASES | tr ',' ' '); do
db=$(echo $entry | cut -f1 -d-)
pw=$(echo $entry | cut -f2 -d-)
create_user_and_database $db $pw
done
echo "Multiple databases created"
fi
我的问题是:在某个时候(现在;)),我可能想添加其他服务。仅向环境变量添加额外的一对是行不通的,因为如果数据已经存在,则Postgres映像将跳过初始化步骤。有没有办法可以实现这种行为?
编辑:我应该已经指定要通过更改环境变量从组合文件中自动执行此操作。很明显,当然可以手动完成。
您始终可以使用数据库客户端连接到服务器,并手动进行。如果您不想将数据库端口公开给主机,则可以从postgres容器中的终端运行postgres客户端。要打开容器中的终端:
> docker exec -it <container_name> /bin/sh
然后将用户更改为postgres并启动客户端
# su postgres
postgres@1778e9755f65:/$ psql
一旦在里面创建数据库:https://www.postgresql.org/docs/9.0/sql-createdatabase.html