Docker构建postgres:10.3镜像时创建plpythonu扩展报错求助
解决Docker构建PostgreSQL镜像时创建plpythonu扩展的问题
嘿,这个问题我太熟了!你之所以在docker build阶段执行psql -c "create extension plpythonu;"会报错,核心原因是:Docker构建过程中每个RUN指令都是在一个独立的临时容器里运行的,此时PostgreSQL服务并没有启动,psql根本无法连接到数据库实例。
下面给你两种可行的解决方案,首推第一种,完全贴合PostgreSQL官方镜像的设计逻辑:
方案一:利用镜像的初始化脚本机制(推荐)
PostgreSQL官方镜像提供了一个特殊目录/docker-entrypoint-initdb.d/,当容器第一次启动并初始化数据库时,会自动执行这个目录下所有的.sql、.sh或.sql.gz文件,而且此时数据库服务已经正常运行了。
步骤如下:
- 在你的项目目录下创建一个初始化SQL脚本,比如命名为
init-plpythonu.sql,内容就一行:
create extension plpythonu;
- 修改你的Dockerfile,把这个脚本复制到指定目录:
FROM postgres:10.3 RUN apt update && apt install -y postgresql-plpython-10 COPY init-plpythonu.sql /docker-entrypoint-initdb.d/
这样当你启动容器时,镜像的entrypoint会自动帮你执行这个脚本,完成扩展的创建,完全避开构建阶段服务未启动的问题。
方案二:在同一个RUN里临时启动服务(不推荐,仅作了解)
如果你非要在构建阶段完成扩展创建(其实没必要,因为扩展是绑定到具体数据库实例的,构建阶段的数据库数据在容器启动时会被重新初始化),可以在同一个RUN指令里启动服务、执行命令、再关闭服务:
FROM postgres:10.3 RUN apt update && apt install -y postgresql-plpython-10 \ # 临时启动postgres服务 && service postgresql start \ # 切换到postgres用户执行创建扩展命令 && su - postgres -c "psql -c 'create extension plpythonu;'" \ # 关闭服务 && service postgresql stop
注意:这种方法有个坑——PostgreSQL官方镜像的VOLUME设置会导致构建阶段创建的数据库数据在容器启动时被覆盖,所以实际启动容器后你还是得重新创建扩展,因此方案一才是更合理的选择。
内容的提问来源于stack exchange,提问作者kurtgn
相关产品推荐
相关产品推荐

