下载镜像

我使用的镜像版本是12.20

docker pull postgres:12.20

检查镜像是否下载完成

docker image ls

image-20240906224804110

编写启动脚本

start-postgres.sh

#!/bin/bash  

# 创建WAL文件归档目录并授权
mkdir -p /home/postgres/arch/
chmod +777 /home/postgres/arch/
# 创建日志存放目录并授权
mkdir -p /var/log/postgresql/
chmod +777 /var/log/postgresql/

# 启动程序
su postgres -c  "pg_ctl -D /var/lib/postgresql/data -l /var/log/postgresql/pglog.log start"

# 保持容器运行(例如,通过tail命令保持前台进程)  
tail -f /var/log/postgresql/pglog.log

脚本授运行权chmod +x start-postgres.sh

docker-compose.yml

version: '3.8'
services:
  postgres2:
    image: postgres:12.20
    container_name: postgres2
    restart: always
    environment:
      POSTGRES_PASSWORD: abc123
      ALLOW_IP_RANGE: 0.0.0.0/0
    volumes:
      - /root/docker-run/postgres2/data:/var/lib/postgresql/data
      - /root/docker-run/postgres2/scripts:/usr/local/bin/scripts
      - /root/docker-run/postgres2/logs:/var/log/postgresql
    ports:
      - "5434:5432"
    entrypoint: /usr/local/bin/scripts/start-postgres.sh

/usr/local/bin/scripts/start-postgres.sh 是自定义的启动脚本,主要目的是将日志文件输出方便后面排查问题。

dockerRun.sh

第一次启动时因为执行容器的入口脚本 /usr/local/bin/docker-entrypoint.sh 导致没有正常初始化数据库,会出现问题,所以编写该脚本,先初始化一次,然后在执行自定义的脚本

docker stop postgres2
docker rm postgres2

docker run -it --name postgres2 \
--restart always \
-e POSTGRES_PASSWORD='abc123' \
-e ALLOW_IP_RANGE=0.0.0.0/0 \
-v /root/docker-run/postgres2/data:/var/lib/postgresql/data \
-p 0.0.0.0:5434:5432 \
-d postgres:12.20


docker stop postgres2
docker rm postgres2
docker-compose up -d

后面再不删除data的情况下可以使用命令 docker-compose up -d 重建容器

使用 docker ps -a 检查容器是否创建成功