如何在 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 脚本中创建用户/数据库 的相关文章

  • Bash 实例未嵌套在 Dockerfile `RUN` 中

    嵌套 bash 实例会递增 SLVL 环境变量 http tldp org LDP abs html internalvariables html http tldp org LDP abs html internalvariables h
  • 为什么 PostgreSQL 不能做这个简单的 FULL JOIN 呢?

    这是包含 2 个表的最小设置a and b每行 3 行 CREATE TABLE a id SERIAL PRIMARY KEY value TEXT CREATE INDEX ON a value CREATE TABLE b id SE
  • 检查 Git 中是否需要 pull

    如何检查远程存储库是否已更改并且需要拉取 现在我使用这个简单的脚本 git pull dry run grep q v Already up to date changed 1 但它比较重 有没有更好的办法 理想的解决方案是检查所有远程分支
  • 根据日期顺序排名

    我的数据如下 Heading Date A 2009 02 01 B 2009 02 03 c 2009 02 05 d 2009 02 06 e 2009 02 08 我需要如下排名 Heading Date Rank A 2009 02
  • 由于键更改而尝试插入时外键约束失败

    我有一个 Content 对象 它引用多对多关系中的一组 Tag 对象 作为持久化新内容对象的一部分 我在 PostgreSQL 中查看标签是否已存在 如果存在 则将对其的引用添加到内容对象并尝试保存内容对象 我遇到的问题是 当我这样做时
  • JDBC插入实数数组

    我试图将一个真实的数组插入到 postgresql 数组中 该表的定义是 String sqlTable CREATE TABLE IF NOT EXISTS ccmBlock sampleId INTEGER block REAL 插入内
  • docker 构建失败,无法解析“archive.ubuntu.com”

    我无法使用以下 Dockerfile 构建映像 FROM ubuntu RUN apt get y update apt get y install nodejs npm ssh cache npm install when package
  • Rails 4.1 环境变量未重新加载

    我创建了一个application yml文件在配置目录中并添加了一些键值对 即AWS REGION us east 1 我还添加了以下内容application rb读取文件并更新 ENV 哈希 if Rails env developm
  • Bash 中的动态变量名称

    我对 bash 脚本感到困惑 我有以下代码 function grep search magic way to define magic variable 1 ls tail 1 echo magic variable 1 我希望能够创建一
  • 提高第一个查询的性能

    如果执行以下数据库 postgres 查询 则第二次调用要快得多 我猜第一个查询很慢 因为操作系统 linux 需要从磁盘获取数据 第二个查询受益于文件系统级别和 postgres 中的缓存 有没有一种方法可以优化数据库以快速获得结果fir
  • 从postgresql中的jsonb嵌套数组中删除键值对

    我有 jsonb 数据作为 a b 1 c 2 d 3 b 4 c 5 d 6 g b 1 c 2 d 3 b 4 c 5 d 6 我想从 a 和 g 键的嵌套数组中删除 c 键 是否有一个查询可以执行此操作 SELECT jsonb ob
  • 没有特权访问的 Docker VPN IPSec 客户端

    我有一个 mysql 数据库 只有在建立 VPN 连接后才能访问 IpSec shared secret 用户名 密码 所以我想运行一个隔离的docker容器 它将建立此连接并以某种方式代理 公开mysql端口 以便其他容器可以连接到它而不
  • 在主机和子docker之间共享图像

    我读了这篇文章http blog docker io 2013 09 docker can now run within docker http blog docker io 2013 09 docker can now run withi
  • 如何检查主机是否在您的known_host ssh中

    我的脚本中使用以下命令 将主机添加到 ssh 中的已知主机 VAR2 expect c spawn ssh o StrictHostKeyChecking no REMOTE HOST USER REMOTE HOST IP expect
  • 设置 git 别名,但调用它会给出“找不到命令”

    我想在 git 中设置一个别名来计算存储库中的总行数 因此我进入 Git Bash 并输入以下内容 git config global alias linecount ls files z xargs 0 wc l 我输入命令后 没有出现错
  • 为什么 Docker 不支持多租户?

    我看了这个关于 Docker 的 YouTube 视频 https www youtube com watch v vb7U 9AO7Ww22 00 演讲者 Docker 产品经理 说道 您可能会想 Docker 不支持多租户 您是对的 但
  • 为什么 PostgreSQL 会重新分配角色命令,更改模板数据库的所有者

    想象一下现有的数据库称为store a与一表产品 还有一个用户叫store a user 数据库 表 数据 对象等都属于store a user 我现在创建一个名为的新用户store b user和一个名为的新数据库store b通过模板化
  • 使用.sh脚本设置环境变量

    如何编写 sh 脚本以在 Ubuntu 14 上全局设置环境变量 i e bin sh sets this in to master etc environment export DB HOST 123 我知道我可以运行这个脚本 它只会将其
  • Python + PostgreSQL + 奇怪的ascii = UTF8编码错误

    我有包含字符的 ascii 字符串 x80 代表欧元符号 gt gt gt print x80 当将包含该字符的字符串数据插入数据库时 我得到 psycopg2 DataError invalid byte sequence for enc
  • Bash 循环遍历具有行和列的变量

    经过几个小时的搜索测试不同的解决方案后 我尚未找到可行的解决方案 Bash 和 Shell 脚本不是我的强项 我有一个变量 其中有行 换行 和列 制表符分隔 我想要做的是循环遍历行并获取 Column X 然后将该项目放入变量中 以便我可以

随机推荐

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

    这个问题在这里已经有答案了 我试图从一个表中选择所有值 然后选择仅运行这些列之一的函数的输出 并将所有这些显示为我的 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