1. 项目概述作为一名长期从事数据库系统开发和运维的工程师我经常需要在项目中部署带有地理信息系统(GIS)功能的PostgreSQL数据库。最近PostgreSQL 18版本发布后我发现官方镜像中并未预装PostGIS和pgvector这两个关键扩展这给项目部署带来了不便。于是我决定自己构建一个包含这些扩展的Docker镜像并将整个过程记录下来分享给大家。这个Docker镜像基于阿里云镜像仓库中的PostgreSQL 18基础镜像通过Dockerfile自动化安装了PostGIS 3和pgvector扩展。PostGIS为PostgreSQL提供了强大的地理空间数据处理能力而pgvector则支持高效的向量相似度搜索这两个扩展在现代应用开发中都非常重要。2. 环境准备与基础镜像选择2.1 基础镜像考量在选择基础镜像时我对比了几个选项官方PostgreSQL镜像虽然纯净但需要从头安装所有扩展第三方预构建镜像可能存在版本滞后或安全风险阿里云镜像仓库的PostgreSQL镜像更新及时国内下载速度快最终我选择了阿里云镜像仓库中的最新版PostgreSQL 18镜像作为基础主要基于以下考虑国内网络环境下拉取速度快镜像经过优化体积相对较小与官方镜像保持同步更新FROM registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres:latest2.2 构建环境配置在开始构建前需要确保本地环境满足以下要求Docker引擎版本不低于20.10.0至少2GB可用磁盘空间稳定的网络连接用于下载依赖包提示建议在Linux环境下进行构建可以避免Windows或Mac上可能出现的文件权限问题。3. Dockerfile详细解析3.1 基础配置首先设置非交互式环境变量避免安装过程中出现需要用户输入的提示ENV DEBIAN_FRONTENDnoninteractive这个设置特别重要因为在自动化构建过程中任何交互式提示都会导致构建失败。3.2 扩展安装PostGIS扩展的安装需要多个组件协同工作RUN apt-get update \ apt-get install -y --no-install-recommends \ postgresql-18-postgis-3 \ postgresql-18-postgis-3-scripts \ postgis \ apt-get clean \ rm -rf /var/lib/apt/lists/*这段命令做了以下几件事更新apt软件包索引安装PostGIS核心组件postgresql-18-postgis-3PostgreSQL 18的PostGIS 3扩展postgresql-18-postgis-3-scriptsPostGIS安装脚本postgisPostGIS命令行工具清理apt缓存以减少镜像体积3.3 完整功能版Dockerfile对于需要更多功能的场景我准备了包含客户端工具和pgvector扩展的版本FROM registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres:latest ENV DEBIAN_FRONTENDnoninteractive RUN apt-get update \ apt-get install -y --no-install-recommends \ postgresql-client \ postgresql-contrib \ postgresql-18-postgis-3 \ postgresql-18-postgis-3-scripts \ postgis \ postgresql-18-pgvector \ apt-get clean \ rm -rf /var/lib/apt/lists/*这个版本额外安装了postgresql-clientPostgreSQL命令行客户端postgresql-contribPostgreSQL额外贡献模块postgresql-18-pgvector向量相似度搜索扩展4. 镜像构建与推送4.1 构建命令详解构建镜像的基本命令如下docker build -t registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres-with-gis:18.3 .这个命令的关键参数-t指定镜像标签.表示使用当前目录下的Dockerfile建议的完整构建流程创建专用构建目录将Dockerfile保存到该目录执行构建命令4.2 镜像推送如果需要将镜像推送到私有仓库docker login registry.cn-hangzhou.aliyuncs.com docker push registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres-with-gis:18.3注意推送前需要先登录镜像仓库并确保有相应的推送权限。5. 容器运行与管理5.1 数据持久化配置为了确保数据库数据持久化需要预先创建数据目录并设置正确权限sudo mkdir -p /data/postgres/ sudo chown -R 999:999 /data/postgres这里使用999:999是因为PostgreSQL容器默认使用这个UID/GID运行避免权限问题。5.2 容器启动命令完整的容器启动命令docker run -d -it \ --privilegedtrue \ --restartalways \ --name postgres-gis \ -e POSTGRES_PASSWORDYo5WYypu0mCCheOU \ -p 5432:5432 \ -v /data/postgres/data:/var/lib/postgresql/18 \ registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres-with-gis:18.3参数说明--privilegedtrue给予容器更多权限某些GIS功能需要--restartalways容器退出时自动重启-e POSTGRES_PASSWORD设置超级用户密码-p 5432:5432端口映射-v数据卷挂载5.3 安全建议生产环境务必使用强密码替换示例密码考虑使用--env-file从文件加载环境变量避免密码出现在命令历史中限制容器的网络访问权限6. 扩展功能验证6.1 PostGIS功能验证容器启动后可以连接到数据库并验证PostGIS安装CREATE EXTENSION postgis; SELECT PostGIS_version();6.2 pgvector功能验证对于包含pgvector的镜像可以这样验证CREATE EXTENSION vector; SELECT NULL::vector;7. 常见问题与解决方案7.1 构建失败依赖问题问题现象构建时出现依赖错误解决方案确保使用正确的PostgreSQL版本号如18检查apt源配置是否正确尝试先运行apt-get update单独命令7.2 容器启动失败权限问题问题现象容器启动后立即退出日志显示权限错误解决方案确认数据目录权限设置为999:999检查SELinux/AppArmor设置尝试使用--user参数明确指定运行用户7.3 扩展加载失败问题现象创建扩展时报错解决方案确认安装的扩展版本与PostgreSQL版本匹配检查容器内是否确实安装了相应扩展查看PostgreSQL日志获取详细错误信息8. 性能优化建议8.1 镜像构建优化使用多阶段构建减少最终镜像大小合并RUN指令减少镜像层数清理不必要的缓存和临时文件8.2 容器运行优化根据主机资源调整PostgreSQL配置参数为容器分配适当的CPU和内存限制考虑使用单独的数据卷容器管理持久化数据9. 实际应用场景9.1 地理信息系统应用这个镜像特别适合需要处理地理空间数据的应用如地图服务位置数据分析地理围栏应用9.2 向量搜索应用结合pgvector扩展可以构建推荐系统相似图片搜索自然语言处理应用10. 维护与升级策略10.1 版本升级当PostgreSQL新版本发布时修改Dockerfile中的版本号重新测试所有扩展功能使用新标签推送镜像10.2 安全更新定期重建镜像获取安全更新扫描镜像中的漏洞更新依赖包版本在实际使用中我发现这种自定义镜像的构建方式虽然需要一些初始投入但长期来看可以大大简化部署流程特别是在需要频繁创建相似环境的场景下。通过合理的标签策略和版本控制可以很好地管理不同版本和配置的镜像。
企业数字化 ERP 产品动态
相关推荐
基于Whisper与PyDub的智能音频切割技术解析 1. 项目背景与核心价值音频处理是多媒体领域的基础需求之一,而长音频文件的自动化切割在实际工作中尤为常见。无论是播客剪辑、课程录制还是会议记录,我们经常需要将数小时的长音频按语义或时间间隔拆分为独立片段。传统音频编辑软件虽然功能强大&#x… · 2026/11/6 5:58:07
力扣227题解析:栈在四则运算计算器中的应用 1. 题目背景与核心挑战力扣227题"基本计算器Ⅱ"是一个经典的字符串处理与栈应用问题。题目要求实现一个能够处理加减乘除四则运算的计算器,输入字符串包含非负整数、空格和加减乘除运算符,需要根据运算符优先级正确计算结果。这个题目之所以被… · 2026/11/6 5:57:07
免费虚拟化管理平台安装配置全攻略:从硬件选型到虚拟机部署 1. 为什么我还要折腾一台本地虚拟化管理平台手里攒了几台淘汰下来的迷你主机和小型工作站,CPU 核心数够、内存也能加到 64G,扔了可惜,卖二手又不值几个钱。最开始我是拿它们跑单机系统做测试,装个系统、配个服务、跑个压测&#x… · 2026/11/6 5:57:07
杭州初级电工证报考通过率揭秘:避开这些坑,一次拿证不费力 杭州初级电工证报考通过率揭秘:避开这些坑,一次拿证不费力 怕考不过白交培训费?杭州初级电工证报考流程看似简单,但每年仍有大量考生因准备不足、流程不清、时间分配不当等原因被“劝退”。本文为你揭秘通过率背后的真实细节,帮你少走弯路。 ###… · 2026/11/6 21:14:40
深圳哪学电工证在哪考?上岗必备证件别再犹豫了 深圳哪学电工证在哪考?上岗必备证件别再犹豫了 你是不是正在为找工作发愁?是不是听说现在电工岗必须要有特种作业操作证?别急,我来告诉你【深圳哪学电工证】的全部真相,还有怎么考、怎么上岗,一步到位。 在深圳做电工, 特种作业操作证 几乎是… · 2026/11/6 21:14:40
章丘电工作业上岗证考前押题攻略:工地太忙根本没时间复习考试怎么办? 章丘电工作业上岗证考前押题攻略:工地太忙根本没时间复习考试怎么办? 工地太忙根本没时间复习考试,这是很多一线电工的真实写照。特别是像章丘这样的建筑工地集中区域,施工进度紧、任务重,电工不仅要负责设备接电、线路检修,还要随时应对突发故障。然而… · 2026/11/6 21:14:40
正规电工证图片 证书实操考试考什么 正规电工证图片证书怎么考?良心建议教你避开中介坑 不知道去哪报名怕被中介坑?现在考电工证的人越来越多,但一不小心就踩坑,花大钱还拿不到正规电工证图片证书。尤其是刚转岗的许昌朋友,想搞清楚电工证到底怎么考、怎么避坑,今天就来给你讲清楚。… · 2026/11/6 21:14:40
_有限空间作业许可证证丢了怎么补办 有限空间作业许可证丢了怎么补办 在哪考才靠谱 找不到有限空间作业许可证,上班都成问题,这事儿我跟你说,真不是开玩笑的。现在工地、工厂、矿场这些地方, 有限空间作业许可证 是必须的, 在哪考 得搞清楚,别耽误了找工作。… · 2026/11/6 21:13:40
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23
三菱PLC数据采集到数据库的时序设计:Python+MC协议实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:02:11
ASIC主模式RTL设计:状态机与三态驱动的流片级实现 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:02:11
STM32嵌入式C++开发:GDB调试与Renode仿真实战指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:02:11
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23