我正在尝试从docker-compose文件中启动一个postgres容器并对其进行初始化。
docker-compose.yml
version: "3"
postgres:
image: "postgres"
command: bash -c "
postgres &&
createuser -l \"auser\"
"
我的目标是: 1)启动postgres容器 2)创建一个用户
当前实现失败,并出现以下错误
"root" execution of the PostgreSQL server is not permitted.
The server must be started under an unprivileged user ID to prevent
possible system security compromise. See the documentation for
more information on how to properly start the server.
答案 0 :(得分:3)
不允许PostgreSQL服务器的“ root”执行。
您不应与root
用户一起运行数据库容器。更好地运行postgres
用户。
一种方法是在docker-compose中指定用户。
postgres:
image: postgres
container_name: postgres
user: postgres
ports:
- "5432:5432"
command: 'postgres'
但是再次
command: bash -c "
postgres &&
createuser -l \"auser\"
"
在创建用户命令期间,可能包含DB的数据库尚未准备好接受连接。
所以您有两个最佳选择。
POSTGRES_USER
此可选环境变量与
POSTGRES_PASSWORD
设置用户及其密码。 此变量 将创建具有超级用户权限的指定用户和一个数据库 。如果未指定,则默认用户为 postgres 。
postgres:
image: postgres
container_name: postgres
environment:
POSTGRES_USER: test
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp
user: postgres
ports:
- "5432:5432"
第二个选项
初始化脚本
如果您想对派生的图像进行其他初始化 在这一项中,在下添加一个或多个
*.sql, *.sql.gz, or *.sh scripts
/docker-entrypoint-initdb.d
(必要时创建目录)。 在入口点调用initdb之后,创建默认的postgres用户 和数据库,它将运行任何*.sql files
,运行任何可执行文件*.sh
脚本,并在其中找到任何不可执行的*.sh
脚本 目录以在启动服务之前进行进一步的初始化。
例如,要添加其他用户和数据库,请将以下内容添加到/docker-entrypoint-initdb.d/init-user-db.sh
:
#!/bin/bash
set -e
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL