docker-compose 部署PostGIS

本文介绍了如何使用docker-compose.yml文件配置PostGIS容器,包括设置环境变量如数据库用户和密码,映射本地数据目录,以及在启动时创建PostGIS扩展。
  1. 目录
    ├─docker-compose.yml
    ├─postgis
  2. docker-compose.yml
version: '3'

services:
  postgis:
    image: kartoza/postgis  
    container_name: postgis
    restart: always     
    environment:         
      # POSTGRES_DB: mydatabase   
      POSTGRES_USER: root   
      POSTGRES_PASSWORD: 123456  
      ALLOW_IP_RANGE: 0.0.0.0/0
    ports:
      - "5432:5432"       
    volumes:              
      - ./postgis:/var/lib/postgresql   # 将本地 data 目录映射到容器内的 /var/lib/postgresql/data 目录
    networks:
      - net_postgis 
networks:
  net_postgis:
  1. docker-compose up -d
  2. 创建扩展
    CREATE EXTENSION postgis;
    在这里插入图片描述
<think> 我们有两个引用,其中引用[1]提到了一个使用PostgreSQL镜像的数据库服务,并提到了数据持久化到卷。引用[2]则详细说明了卷的配置,包括使用本地驱动、NFS等,以及多环境配置和资源限制。 用户的问题:使用Docker-compose.yml打包PostgreSQL并附带初始化SQL语句init.sql的方法。 根据Docker官方文档,PostgreSQL镜像支持在容器第一次启动时执行初始化脚本。具体方法是将初始化脚本(.sh、.sql或.sql.gz)放入/docker-entrypoint-initdb.d/目录中。因此,我们需要在docker-compose.yml中做两件事: 1. 将本地的init.sql文件挂载到容器内的/docker-entrypoint-initdb.d/目录。 2. 确保挂载的init.sql文件在容器启动时被正确执行。 注意:只有当数据目录为空时,初始化脚本才会执行。如果已经存在数据库数据(比如卷已经存在数据),则不会执行。因此,通常我们会使用一个卷来持久化数据库数据,但初始化脚本只会在第一次创建卷时运行。 步骤: 1. 准备一个init.sql文件,放在与docker-compose.yml相同的目录(或者指定路径)。 2. 在docker-compose.yml中,配置PostgreSQL服务,挂载init.sql文件到/docker-entrypoint-initdb.d/。 示例docker-compose.yml: 假设项目结构: project/ docker-compose.yml init.sql docker-compose.yml内容: ```yaml version: '3.8' services: db: image: postgres:latest restart: always environment: POSTGRES_USER: your_username POSTGRES_PASSWORD: your_password POSTGRES_DB: your_database volumes: # 持久化数据卷 - postgres_data:/var/lib/postgresql/data # 挂载初始化SQL脚本 - ./init.sql:/docker-entrypoint-initdb.d/init.sql volumes: postgres_data: ``` 注意:由于我们使用了卷`postgres_data`来持久化数据,因此第一次运行`docker-compose up`时,PostgreSQL容器会创建卷并将`init.sql`中的SQL语句执行。之后如果卷已经存在,则不会再次执行。 如果需要多个初始化脚本,可以挂载整个目录,或者挂载多个文件(使用多个卷挂载,或者将多个文件放在一个目录中挂载整个目录)。 例如,如果有多个SQL文件: volumes: - ./init-scripts/:/docker-entrypoint-initdb.d/ 这样,init-scripts目录下的所有.sql、.sh等文件都会按字母顺序执行。 另外,引用[2]中提到了卷的配置,我们可以参考其中的卷配置,例如使用本地驱动等,但这里我们只需要一个简单的本地卷即可。 因此,回答用户问题:我们通过挂载初始化SQL文件到容器的/docker-entrypoint-initdb.d/目录来实现。 同时,注意环境变量的设置(如用户名、密码和数据库名)也是必要的,因为初始化脚本中可能会使用到这些环境变量(比如创建用户和数据库),但Postgres镜像在初始化时会自动创建指定的用户和数据库(通过环境变量设置),所以init.sql中通常不需要再创建数据库和用户(除非有特殊需求)。 如果init.sql中需要创建数据库,请注意环境变量已经创建了数据库,所以避免重复创建。如果不需要,可以不用设置环境变量,而在init.sql中创建。 另外,如果init.sql中需要创建扩展(如postgis),则需要先安装扩展。但注意,初始化脚本执行时,数据库已经创建(如果通过环境变量指定了数据库),所以可以直接在init.sql中写创建扩展的语句。 总结:核心是挂载初始化SQL文件到/docker-entrypoint-initdb.d/目录。 根据引用[1]和[2],我们还注意到网络和卷的配置。在示例中,我们将数据卷独立出来,这样数据可以持久化。同时,如果需要连接其他服务(如web服务),可以配置网络,但用户问题中没有提到,所以我们只配置数据库服务。 因此,我们给出一个完整的示例,并解释关键点。 我们还可以提到,如果用户需要更复杂的初始化(例如执行多个脚本,或者执行shell脚本),也可以使用相同的方式挂载。 注意:如果初始化脚本需要可执行权限(对于.sh文件),则要确保本地文件有可执行权限,或者在容器内通过脚本设置(但通常不需要,因为entrypoint会处理)。 最后,我们生成相关问题。 </think> 通过 Docker Compose 打包 PostgreSQL 并加载初始化 SQL 脚本,需使用 PostgreSQL 镜像的初始化机制。以下是具体实现方法: ### 1. 创建项目结构 ```bash your-project/ ├── docker-compose.yml ├── init.sql # 初始化SQL脚本 └── postgres-data/ # 持久化数据目录 ``` ### 2. 配置 `docker-compose.yml` ```yaml version: '3.8' services: postgres: image: postgres:15-alpine container_name: pg-db environment: POSTGRES_USER: admin POSTGRES_PASSWORD: securepass POSTGRES_DB: app_db volumes: # 挂载初始化脚本到容器入口目录 - ./init.sql:/docker-entrypoint-initdb.d/init.sql # 持久化数据卷(参考引用[1]) - ./postgres-data:/var/lib/postgresql/data ports: - "5432:5432" networks: - db-net # 创建专用网络(参考引用[1]) networks: db-net: driver: bridge # 数据卷声明(参考引用[2]) volumes: postgres-data: driver: local ``` ### 3. 创建 `init.sql` 初始化脚本 ```sql -- 创建示例表 CREATE TABLE users ( id SERIAL PRIMARY KEY, email VARCHAR(255) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT NOW() ); -- 初始数据 INSERT INTO users (email) VALUES ('user1@example.com'), ('user2@example.com'); ``` ### 4. 关键机制说明 1. **初始化目录**:PostgreSQL 镜像会自动执行 `/docker-entrypoint-initdb.d/` 目录下的 `.sql/.sh` 文件 2. **执行条件**:仅在数据库首次初始化时执行(数据目录为空时) 3. **持久化存储**:使用本地卷 `postgres-data` 保存数据(参考引用[1][2]) 4. **网络隔离**:通过 `db-net` 实现网络隔离(参考引用[1]) ### 5. 启动服务 ```bash docker-compose up -d ``` 日志将显示: ```log postgres_1 | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init.sql postgres_1 | CREATE TABLE postgres_1 | INSERT 0 2 ``` ### 验证初始化 ```bash docker exec -it pg-db psql -U admin -d app_db -c "SELECT * FROM users;" ``` 输出: ``` id | email | created_at ----+-------------------+---------------------------- 1 | user1@example.com | 2023-10-05 08:30:00.123456 2 | user2@example.com | 2023-10-05 08:30:00.123456 ``` ### 注意事项 1. **脚本顺序**:按文件名字母顺序执行,可通过 `01-init.sql` 命名控制 2. **权限问题**:确保 `init.sql` 文件可读(建议 `chmod a+r init.sql`) 3. **数据持久化**:删除容器时,`postgres-data` 目录保留数据 4. **环境变量**:SQL 中可用 `${POSTGRES_USER}` 引用环境变量 5. **高级配置**:支持 NFS 存储(参考引用[2]的卷驱动配置) > 此方案利用 PostgreSQL 官方镜像的初始化机制,确保数据库启动时自动执行 SQL 脚本,并通过 Docker 卷实现数据持久化存储[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值