由于业务需要,需要使用到postgres数据库的postgis、timescaledb以及pg_cron插件,又因线上环境数据库使用docker部署,故需要部署手动构建镜像。
- 编写Dockerfile
# 使用 PostgreSQL 16.2 作为基础镜像
FROM postgres:16.2
# 安装必要的依赖
RUN apt-get update && \
apt-get install -y gnupg postgresql-common apt-transport-https lsb-release wget && \
rm -rf /var/lib/apt/lists/*
# 使用清华大学的 Debian 镜像源
RUN echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main non-free contrib" > /etc/apt/sources.list && \
echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian-security/ bookworm-security main" >> /etc/apt/sources.list && \
echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main" >> /etc/apt/sources.list
# 添加 TimescaleDB 仓库
RUN sh -c "echo 'deb [signed-by=/usr/share/keyrings/timescale.keyring] https://packagecloud.io/timescale/timescaledb/debian/ $(lsb_release -c -s) main' > /etc/apt/sources.list.d/timescaledb.list" && \
wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | gpg --dearmor -o /usr/share/keyrings/timescale.keyring
# 添加 pg_cron 仓库
RUN sh -c "echo 'deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main' > /etc/apt/sources.list.d/pgdg.list" && \
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /usr/share/keyrings/postgresql.gpg
# 导入缺失的公钥
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7FCC7D46ACCC4CF8
# 更新包列表并安装插件,如果还有别的插件,在此处添加对应的包名注意版本号要对齐
RUN apt-get update && \
apt-get install -y timescaledb-2-postgresql-16 postgresql-16-postgis-3 postgresql-16-cron && \
rm -rf /var/lib/apt/lists/*
# 修改 PostgreSQL 配置以加载 TimescaleDB 和 pg_cron
RUN echo "shared_preload_libraries = 'timescaledb,pg_cron'" >> /usr/share/postgresql/postgresql.conf.sample
# 设置数据库初始化脚本
COPY init-db.sh /docker-entrypoint-initdb.d/
# 设定容器启动时的默认命令
CMD ["postgres"]
- 编写启动脚本
#!/bin/bash
set -e
# 创建数据库扩展
echo "Creating extensions..."
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS postgis_topology;
CREATE EXTENSION IF NOT EXISTS pg_cron;
EOSQL
echo "Extensions created successfully."
- 将上面两个文件放在同一个目录下,并在该目录下构建镜像
# 构建镜像
docker build -t wesafer-postgres:v2 .
# 如果构建时拉取postgres镜像失败,可以尝试先手动拉取:
# docker pull postgres:16.2
- 启动容器
docker run -d \
--name postgres_db \
-v /data/postgres_data:/var/lib/postgresql/data \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=your_password\
-e POSTGRES_DB=postgres \
-p 5432:5432 \
wesafer-postgres:v2
- 验证安装
SELECT * FROM pg_extension;
- 导出及导入镜像
# 导出镜像导出为tar文件
docker save -o wesafer-postgres-2.tar wesafer-postgres:v2
# 在需要部署的环境导入该镜像tar文件
docker load -i wesafer-postgres-2.tar
注意,pg_cron插件需要指定数据库安装,默认只能在postgres数据库安装,如需变更需要修改postgresql.conf:
cron.database_name = 'your_database_name' -- 这里需要指定一个数据库名