在 Postgres Docker 容器中安装扩展

在 Postgres Docker 容器中安装扩展

最近,我想使用 Fluent 迁移器来为我的 postgres 数据库做种,该数据库作为 Docker 容器运行。我基本上有一个表 User,它有一个需要自动生成的 UUID 类型的主键。

我的迁移代码如下所示。

csharp 复制代码
Create.Table(User.TABLE_NAME)
    .WithColumn("id").AsGuid().NotNullable().WithDefaultValue(SystemMethods.NewGuid).PrimaryKey()
    .WithColumn("username").AsString().NotNullable()
    .WithColumn("password").AsString().NotNullable();

上面的代码基本上会变成下面的 postgres sql:

sql 复制代码
CREATE TABLE "public"."users"
(
    "id"       uuid NOT NULL DEFAULT uuid_generate_v4(),
    "username" text NOT NULL,
    "password" text NOT NULL,
    CONSTRAINT "PK_users" PRIMARY KEY ("id")
);

请注意查询中使用的默认函数uuid_generate_v4()。如果您使用默认的 Postgres docker 映像来构建容器,这将生成以下错误信息:

text 复制代码
The error was 42883: function uuid_generate_v4() does not exist

这是因为uuid_generate_v4()这个函数是在uuid-ossp扩展中定义的,在执行创建扩展的SQL命令之前必须先将其安装在容器中。由于我们用于 docker compose 处理容器,因此我们将使用它来安装扩展。

我们将定义所需的脚本来在单独的文件中安装扩展,并将其包含在我们的 docker compose 中。

yml 复制代码
\c ntuserauth;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

在上面的代码中,我们使用了 ntuserauth 数据库(这是我们需要安装扩展的数据库),然后指示安装扩展( uuid-ossp 如果它尚不存在)。我们将脚本放在install-extensions.sql这个文件中,并将其放置在我们的脚本目录中。

然后,我们将使用上面定义的脚本复制到 docker-entrypoint-initdb.d下,并用于初始化数据库。

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

让我们继续修改 docker compose配置 以包含脚本:

yml 复制代码
nt.authservice.db:
  image: postgres:14.1-alpine
  container_name: nt.authservice.db
  hostname: "nt.authservice.db"
  restart: always
  environment:
    - POSTGRES_USER=postgres
    - POSTGRES_PASSWORD=mypassword
    - POSTGRES_DB=ntuserauth
  ports:
    - '5432:5432'
  volumes:
    - nt.authservice.db.volume:/var/lib/postgresql/data
    - ./services/db/scripts:/docker-entrypoint-initdb.d

您可以通过对容器中的数据库运行\dx命令来验证是否已正确安装扩展。

text 复制代码
                            List of installed extensions
   Name    | Version |   Schema   |                   Description
-----------+---------+------------+-------------------------------------------------
 plpgsql   | 1.0     | pg_catalog | PL/pgSQL procedural language
 uuid-ossp | 1.1     | public     | generate universally unique identifiers (UUIDs)
(2 rows)

这就确保了我们需要所需的uuid-ossp扩展已经安装在postgres容器中,并且使我们能够用Fluent的迁移功能来初始化数据库。

原文地址

相关推荐
Ares-Wang15 分钟前
flask》》多线程并发数据安全问题 threading.local werkzeug.local.Local
后端·python·flask
覆东流23 分钟前
第2天:Python变量与数据类型
开发语言·后端·python
yuanzhengme25 分钟前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
国产化创客1 小时前
RuView开源项目Docker+ESP32完整部署手册
物联网·docker·容器·开源·信息与通信·智能硬件·wifi-csi
Rust研习社1 小时前
Rust Default 特征详解:轻松实现类型默认值
开发语言·后端·rust
高铭杰1 小时前
neon源码分析(3)写入流程
postgresql·neon
南囝coding1 小时前
零成本打造专业域名邮箱:Cloudflare + Gmail 终极配置保姆级全攻略
前端·后端
SL-staff2 小时前
2026企业文档选型白皮书:功能、技术栈、私有化部署与采购建议
spring cloud·docker·微服务·kubernetes·开源·私有化部署·企业文档
李二毛2 小时前
看到 done=true,就说明前面的写入都可见吗?
后端
Master_Azur2 小时前
JavaEE之Stream流
后端