如何在Docker运行的PostgreSQL容器中安装PostGIS?
在Docker PostgreSQL容器中配置PostGIS的解决方案
方案一:基于官方Postgres镜像安装PostGIS
方法1:通过初始化脚本自动部署
- 在项目中创建
./database/init-scripts目录,新建init-postgis.sh脚本:
#!/bin/bash set -e # 安装PostGIS依赖包 apt-get update && apt-get install -y postgresql-$POSTGRES_VERSION-postgis-$POSTGIS_VERSION postgis # 连接数据库并启用PostGIS扩展 psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL CREATE EXTENSION IF NOT EXISTS postgis; CREATE EXTENSION IF NOT EXISTS postgis_topology; EOSQL
- 修改
docker-compose.yml,指定固定版本、添加环境变量并修正挂载路径:
version: '3.8' services: test-db: image: postgres:15 # 固定版本避免兼容性问题,可根据需求调整 restart: always ports: - '5434:5432' environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: testdb POSTGIS_VERSION: 3.3 # 与Postgres版本匹配,比如15对应3.3 volumes: - ./database/postgres:/var/lib/postgresql/data # 官方Postgres默认数据目录,原配置的/data路径错误 - ./database/init-scripts:/docker-entrypoint-initdb.d
方法2:自定义构建PostGIS镜像
创建专门的Dockerfile.postgis:
FROM postgres:15 ARG POSTGIS_VERSION=3.3 RUN apt-get update && apt-get install -y --no-install-recommends \ postgresql-$PG_MAJOR-postgis-$POSTGIS_VERSION \ postgis \ && rm -rf /var/lib/apt/lists/* # 复制初始化脚本自动启用扩展(可选) COPY init-postgis.sh /docker-entrypoint-initdb.d/ RUN chmod +x /docker-entrypoint-initdb.d/init-postgis.sh
修改docker-compose.yml使用自定义镜像:
version: '3.8' services: test-db: build: context: . dockerfile: Dockerfile.postgis restart: always ports: - '5434:5432' environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: testdb volumes: - ./database/postgres:/var/lib/postgresql/data
方案二:使用官方PostGIS预构建镜像
你之前使用第三方镜像报错是因为未指定有效版本标签,直接使用PostGIS官方维护的镜像即可:
version: '3.8' services: test-db: image: postgis/postgis:15-3.3 # 格式:postgis/postgis:<Postgres版本>-<PostGIS版本> restart: always ports: - '5434:5432' environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: testdb volumes: - ./database/postgres:/var/lib/postgresql/data
启动后连接数据库,执行CREATE EXTENSION IF NOT EXISTS postgis;即可创建geometry类型的表。
关于协作运行的问题
只要你在docker-compose.yml或自定义Dockerfile中完成了PostGIS的配置,其他人执行docker-compose up -d即可:
- 若使用预构建镜像:Docker会自动拉取包含PostGIS的完整镜像
- 若使用自定义镜像:Docker会自动构建包含PostGIS的镜像
- 若使用初始化脚本:容器启动时会自动安装PostGIS
其他人无需手动下载或安装PostGIS,所有依赖由Docker自动管理。
内容的提问来源于stack exchange,提问作者Kaisin Li
相关产品推荐
相关产品推荐

