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

2024-01-09

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

我的 bash 脚本:make_db.sh

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

Dockerfile

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 日起

The 官方 postgres docker 镜像 https://hub.docker.com/_/postgres/会跑.sql中找到的脚本/docker-entrypoint-initdb.d/文件夹。

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

init.sql

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

并将其添加到您的 Dockerfile 中:

Dockerfile

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

但自2015年7月8日起,如果您只需要创建用户和数据库,更容易使用POSTGRES_USER, POSTGRES_PASSWORD and POSTGRES_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 日之前的图像

From postgres Docker 镜像的文档 https://registry.hub.docker.com/_/postgres/,据说

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

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

之后还有另一个有用的信息:

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

同意,乍一看可能有点神秘。它的意思是,你的初始化脚本应该在执行操作之前以单一模式启动 postgres 服务。所以你可以改变你的make_db.ksh脚本如下,它应该让你更接近你想要的:

NOTE,这最近发生了变化在下面的提交中 https://github.com/docker-library/postgres/pull/75/commits。这将适用于最新的更改:

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

以前,使用--single需要模式:

gosu postgres postgres --single <<- EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 如何选择*加上另一列[重复]

    这个问题在这里已经有答案了 我试图从一个表中选择所有值 然后选择仅运行这些列之一的函数的输出 并将所有这些显示为我的 SQL 查询输出 我这样做的目标是从 Geometry 列创建可用的 WKT 输出 并将其包含在查询结果中 这样我就可以在
  • FabricInvalidAddressException:尝试从 .NET Core 应用程序连接时出现 NamedEndpoint“V2Listener”

    我正在尝试使用以下方式连接到 Service Fabric 应用程序ServiceProxy像这样的类 return ServiceProxy Create
  • php和mysql将记录从一个表复制到另一个表

    我想通过将记录从一个表移动到另一个表来对学生进行存档 这是我尝试使用的代码
  • 您相信 ASP.Net MVC 已准备好投入生产吗?

    我真的很喜欢 Microsoft 承诺将 MVC 引入 Web 为此 我对将我现有的 ASP NET 应用程序之一转换为 MVC 感到兴奋 并想知道我是否操之过急 虽然这个网站正在使用 MVC 但它在技术上仍处于测试阶段 您有什么想法 从
  • Google 容器引擎:访问云存储

    我无法让应用程序默认凭据在 Google 容器引擎中工作 文档说它们适用于 App Engine 和 Compute Engine 但我被告知它们应该透明地传递到在 Container Engine 上运行的容器 这是失败的代码 crede
  • iOS 7 状态栏与导航栏发生冲突

    我的应用程序中有一个视图控制器 在故事板中拖动了一个导航栏 它在 iOS 6 中运行良好 但在 iOS 7 中它看起来像这样 状态栏和导航栏不应相互冲突 我在堆栈溢出上看到过很多这样的问题 但它们对我没有太大帮助 有些问题说我应该使用这个
  • asp.net core 检查中间件中的路由属性

    我正在尝试构建一些 ASP Net core 中间件 需要查看当前路由是否标记为 授权 eg public async Task Invoke HttpContext context if context Request Path Valu
  • 在 PyTables 中,如何创建可变长度的嵌套数组?

    我正在使用 PyTables 2 2 1 w Python 2 6 我想创建一个包含可变长度嵌套数组的表 我搜索了 PyTables 文档和教程示例 PyTables 教程 3 8 http www pytables org docs ma
  • Dojo MVC 的简单登录实现

    有没有关于如何实现简单的登录页面 对话框的示例 我一直在尝试使用 dojo 样板来做到这一点 检查我之前的问题 Dojo MVC 的布局实现 https stackoverflow com questions 10953316 layout
  • 更新会话变量而不刷新页面[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当单击 iframe 外部页面 中的链接时 我需要更新第 1 页上的会话变量 当我点击 iframe 的链接时 会话变量已成功设置 问题是
  • 如何读取.net core api项目中appsetting.json文件中的多个连接字符串

    我有多个连接字符串属性 例如 在 AppSetting json 文件中 connectionstring connection1 datasource1 connection2 datasource2 我想读取控制器或服务文件中的连接字符
  • Phalcon Multi module - 动态模块注册

    大家好 我在 Phalcon 的多模块项目中使用以下结构 modules module1 controllers models views module2 controllers models views module n controll
  • 无法使用 Nuitka 编译 Python

    我正在尝试编译使用 urllib request BeautifulSoup 和 网页浏览器 nuitka python py Nuitka WARNING python py 16 Cannot find urllib request a
  • 使用 Add-on SDK 的 Firefox 插件提供更多存储空间

    我想使用插件生成器开发一个插件 我读到 通过简单的存储 一个人的插件可以有大约 5 MB 的空间 但 5 mgb 的空间不足以容纳我的应用程序 我需要更多 我能做什么 考虑到附加 SDK API 您无法做太多事情 相反 你可以冲出沙箱 ht
  • 什么时候应该在 OCaml 中使用对象?

    通常 OCaml 程序可以使用或不使用对象来编写 什么时候使用物品最有利 什么时候应该避免使用物品 作为一般经验法则 不要使用对象 它们带来的额外复杂性通常并不值得 我认为这也是适用于其他语言的规则 但那是另一回事了 至少对于 OCaml
  • 显示本地时间的 MySQL 时间戳

    我有一个 MySQL 数据库 其中存储的大量数据均采用 UTC 时间的时间戳 当用户查询该数据库时 我希望他们能够在本地时区查看数据 我不想每次都计算偏移量并使用 PHP 代码更改时间戳 还有其他办法吗 您可以使用localtime htt
  • android ellipsize 多行textview

    我需要省略多行文本视图 我的组件足够大 可以用椭圆显示至少 4 条线 但只显示 2 条线 我尝试更改组件的最小和最大行数 但它没有任何改变 这是问题的解决方案 它是 TextView 的子类 实际上适用于椭圆化 我发现之前的答案中列出的 a
  • 使用 Cassandra 和 CQL3,如何在单个请求中插入整个宽行?

    我想将包含 50 000 列的单行插入到 Cassandra 1 2 8 中 在插入之前 我已准备好整行的所有数据 在内存中 0 1 2 49999 row id text text text text 列名是整数 允许切片进行分页 列值是
  • 全屏 Python TKinter 或 wxPython 窗口,但“停留在所有窗口的底部”?

    我想创建一个全屏面板 在视觉上阻止对屏幕上所有内容的访问 Ubuntu 11 10 中的桌面 菜单 Unity 面板等 但位于其他应用程序打开的窗口下方 这主要是为了让笔记本电脑具有儿童防护功能 我希望孩子 4 岁 能够访问一些选定的应用程
  • 如何在 Docker Postgres 脚本中创建用户/数据库

    我一直在尝试通过创建自定义用户和数据库来为开发 postgres 实例设置容器 我正在使用官方 postgres docker 镜像 https registry hub docker com postgres 在文档中 它指示您将 bas