当前位置: 首页 > 面试题库 >

如何在Docker Postgres的脚本中创建用户/数据库

谷弘致
2023-03-14
问题内容

我一直在尝试通过创建自定义用户和数据库来为开发postgres实例设置容器。我正在使用官方的postgres
docker镜像
。在文档中,它指示您在/docker- entrypoint-initdb.d/文件夹内插入bash脚本以使用任何自定义参数设置数据库。

我的bash脚本:make_db.sh

su postgres -c "createuser -w -d -r -s docker"
su postgres -c "createdb -O docker docker"

Docker文件

FROM library/postgres

RUN ["mkdir", "/docker-entrypoint-initdb.d"]
ADD make_db.sh /docker-entrypoint-initdb.d/

我从docker logs -f db(db是我的容器名称)得到的错误是:

createuser:无法连接到数据库postgres:无法连接到服务器:没有这样的文件或目录

/docker-entrypoint- initdb.d/在启动postgres之前,似乎正在执行文件夹内的命令。我的问题是,如何使用官方的postgres容器以编程方式设置用户/数据库?有什么办法可以用脚本做到这一点?


问题答案:

编辑-自2015年7月23日起

在正式的Postgresdocker图像将运行.sql脚本中找到的/docker- entrypoint-initdb.d/文件夹中。

因此,您所需要做的就是创建以下sql脚本:

初始化程序

CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;

并将其添加到您的Dockerfile中:

Docker文件

FROM library/postgres
COPY init.sql /docker-entrypoint-initdb.d/

但自2015年7月8日, 如果你需要的是创建一个用户和数据库
,它更容易只是让要用到的POSTGRES_USERPOSTGRES_PASSWORDPOSTGRES_DB环境变量:

docker run -e POSTGRES_USER=docker -e POSTGRES_PASSWORD=docker -e POSTGRES_DB=docker library/postgres

或使用Dockerfile:

FROM library/postgres
ENV POSTGRES_USER docker
ENV POSTGRES_PASSWORD docker
ENV POSTGRES_DB docker

适用于2015年7月23日之前的图像

从postgres Docker映像的文档中可以说,

[…]它将启动在该目录[ /docker-entrypoint-initdb.d]中找到的任何* .sh脚本,以在启动服务之前进行进一步的初始化

这里重要的是 “启动服务之前” 。这意味着您的脚本 make_db.sh 将在启动postgres服务之前执行,因此错误消息
“无法连接到数据库postgres”

之后,还有另一条有用的信息:

如果您需要在初始化过程中执行SQL命令,则强烈建议使用Postgres单用户模式。

同意这乍看起来可能有些神秘。它表示您的初始化脚本在执行操作之前应以单一模式启动postgres服务。因此,您可以按以下方式更改 make_db.ksh
脚本,它应该使您更接近所需的内容:

注意 ,这在最近的提交中已更改。这将适用于最新更改:

export PGUSER=postgres
psql <<- EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL

以前,需要使用--singlemode:

gosu postgres postgres --single <<- EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL


 类似资料:
  • CreateUser:无法连接到数据库postgres:无法连接到服务器:没有这样的文件或目录 似乎在启动postgres之前正在执行文件夹中的命令。我的问题是,我如何使用官方的postgres容器以编程方式设置用户/数据库?有没有办法用脚本做到这一点?

  • 问题内容: 我们正在为Joomla创建XML API,允许合作伙伴网站在我们的网站上为其用户创建新帐户。 我们已经创建了一个独立的PHP脚本来处理和验证API请求,但是现在我们需要实际创建新帐户。最初我们只是考虑进行CURL调用以提交注册表单,但是我们意识到用户令牌存在问题。是否有另一种干净的方法可以创建用户帐户而不用担心Joomla?如果我们必须做一些手术,最好的方法是什么? 问题答案: 您应该

  • 安装oracle 19C后,它要求用户名和密码。输入什么,以及如何创建一个具有所有权限和身份验证权限的新用户。(注意,我试图通过登录SYSDBA创建用户命令,但它显示错误为无效的普通用户或角色名.在这里输入图像描述 [在此处输入图像描述][2]

  • 问题内容: 我想编写一个脚本来在SQL Server Express中创建一个用户(使用密码)。另外,我想为该用户分配全部权限。 问题答案: 根据您的问题,我认为您可能对 User 和 Login 之间的区别有些困惑。一个 登录 的是SQL Server作为一个整体上的账户- 有人谁是能够登录到服务器,谁拥有一个密码。一个 用户 是一个 登录 访问到特定的数据库。 创建 登录 很容易,并且必须(显

  • 问题内容: 我只想在Expect脚本中执行以下bash命令: 我添加到开始但它不起作用。我认为“ <”符号意味不到! 谁能帮我解决这个问题? 问题答案: 我现在找到了解决该问题的方法。我避免使用“ <”符号,因此我们可以改用以下命令:

  • 我使用ARM模板创建了Azure Cosmos DB。但是使用ARM模板,您无法在cosmos db中创建默认集合和数据库。 我有多个Cosmos DB帐户,对于每个Azure Cosmos DB,我想创建一个带有数据库的集合,并在其中插入一些虚拟记录。 因此,有人能建议我如何编写PowerShell脚本来创建默认集合以及每个Azure Cosmos DB中的数据库吗?