从docker-compose文件初始化postgres容器

时间:2019-10-06 15:16:03

标签: postgresql docker docker-compose dockerfile

我正在尝试从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.

1 个答案:

答案 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