Docker-Compose启动PostgreSQL容器报错:type "json_param"不存在
看起来你遇到的是初始化SQL脚本引用了未创建的自定义类型的问题,我来帮你梳理几个排查和解决的方向:
检查初始化脚本的执行顺序
Postgres会按/docker-entrypoint-initdb.d/目录下脚本的文件名排序执行,你的脚本命名是4-schema.sql。你需要确认:有没有更早执行的脚本(比如1-create-types.sql这类)负责创建json_param类型?如果没有,那要么把类型创建语句移到你的4-schema.sql的最前面,要么单独新建一个优先级更高的脚本(比如01-create-custom-types.sql)来创建这个类型,确保它在引用它的schema脚本之前执行。排查你的SQL脚本内容
打开create-schema-docker.sql,定位到报错的第252行附近,找到使用json_param的语句。检查这个脚本里是否包含了CREATE TYPE json_param AS ...;的语句,而且这个语句要出现在所有引用它的表、函数或者其他对象之前。比如如果是创建表时用了这个类型:-- 先创建类型 CREATE TYPE json_param AS json; -- 或者根据实际需求定义成复合类型等 -- 再创建表 CREATE TABLE some_table ( id SERIAL PRIMARY KEY, params json_param );如果脚本里漏掉了创建类型的语句,那就补上。
检查自定义镜像的预设初始化逻辑
你使用的是dr.mediascope.net/mediascope/wf/db:latest这个自定义镜像,这个镜像可能自带了一些初始化脚本。你可以先启动容器(即使报错,容器可能还能短暂运行,或者修改docker-compose.yml把db服务的command改成sleep infinity让容器保持运行),进入容器查看/docker-entrypoint-initdb.d/目录下的所有脚本,看看有没有创建json_param类型的语句。如果镜像里没有这个逻辑,那你就需要自己在初始化脚本里加上类型创建的步骤。手动验证问题
启动容器后,进入Postgres命令行手动测试:docker exec -it workflow_db_test psql -U dev -d wf-db先执行创建
json_param类型的语句(根据实际需求定义,比如如果是JSON的别名就用CREATE TYPE json_param AS json;),然后再执行你的create-schema-docker.sql里的内容,如果能成功执行,就说明确实是类型创建顺序或者缺失的问题。
内容的提问来源于stack exchange,提问作者Александр Шаповалов

