【问题标题】:Use environment variables in docker-compose for initdb of postgres在 docker-compose 中为 postgres 的 initdb 使用环境变量
【发布时间】:2020-05-15 12:52:40
【问题描述】:

我希望使用 *.sql 脚本构建我的基本数据库,并将其放在 /docker-entrypoint-initdb.d/

我的 SQL 文件如下所示:

create schema crm;
alter schema crm owner to ${CRM_SCHEMA_OWNER};
....

当然,使用 psql 导入并不能解析变量。 我现在的问题是,我怎样才能使用这样的环境变量?

我尝试在入口点目录中也有一个 .sh 文件,用环境数据替换 .sql 文件中的字符串,但我总是得到:

db_1 | sed:无法打开临时文件 /docker-entrypoint-initdb.d/sedjKqYgZ:权限被拒绝

我什至尝试过

COPY sql/*.sql /mydata/
RUN ln -sf /mydata/*.sql /docker-entrypoint-initdb.d/

在 Dockerfile 和我的 .sh 脚本中 /docker-entrypoint-initdb.d/

sed -i "s/__CRM_SCHEMA_OWNER__/$CRM_SCHEMA_OWNER/g" /mydata/01_create_crm.sql

但这也没有用。

关于如何使用环境变量设置数据库的任何建议?

谢谢 弗里茨

【问题讨论】:

  • 你有什么解决办法吗?
  • @AshrafulIslam 抱歉,不,我没有进一步采用这种方法。不幸的是,我不得不预先进行替换并将数据硬编码在文件中。
  • 好的。谢谢

标签: postgresql docker environment-variables


【解决方案1】:

目前 postgres docker 镜像将运行 /docker-entrypoint-initdb.d/ 中的 shell 脚本以及 SQL 脚本。你可以这样写:

#!/bin/bash

psql -U ${POSTGRES_USER} <<-END
    create schema crm;
    alter schema crm owner to ${CRM_SCHEMA_OWNER};
END

例如在名为create_crm_schema.sh 的文件中。

来自offical postgres docker image docs

如果您想在从该镜像派生的镜像中进行额外的初始化,请在 /docker-entrypoint-initdb.d 下添加一个或多个 *.sql、*.sql.gz 或 *.sh 脚本(创建必要时目录)。在入口点调用 initdb 创建默认的 postgres 用户和数据库后,它将运行任何 *.sql 文件,运行任何可执行的 *.sh 脚本,并在该目录中找到任何不可执行的 *.sh 脚本以在之前进行进一步初始化启动服务。

【讨论】:

    猜你喜欢
    • 2015-06-17
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 2018-05-08
    • 2021-09-02
    • 1970-01-01
    • 2015-05-29
    相关资源
    最近更新 更多