You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行docker-compose up时initdb脚本未执行的问题求助

问题:Docker中PostgreSQL的initdb脚本未执行

我在Docker环境中使用PostgreSQL,无法让initdb脚本执行。我的Dockerfile内容如下:

FROM golang:latest

WORKDIR /app

COPY go.mod .
COPY go.sum .

RUN go mod download

COPY . .

RUN go build -o rinha ./

CMD ["./rinha"]

我的docker-compose配置如下:

version: '3'

services:
  rinha:
    build:
      context: .
      dockerfile: Dockerfile
    image: rinha
    restart: always
    ports:
      - "8080:8080"
    deploy:
      mode: replicated
      replicas: 1
    environment:
      DSN: "host=postgres port=5432 user=postgres password=password dbname=rinha sslmode=disable timezone=UTC connect_timeout=5"


  postgres:
    image: 'postgres:14.2'
    ports:
      - "5432:5432"
    restart: always
    deploy:
      mode: replicated
      replicas: 1
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: rinha
    volumes:
      - ./data/init.sql:/docker-entrypoint-initdb.d/init.sql
      - ./db-data/postgres/:/var/lib/postgresql/data/
    healthcheck:
      test: pg_isready -U "$$POSTGRES_USER" -d "$$POSTGRES_DB"
      interval: 10s
      timeout: 2s
      retries: 10

我已确认initdb脚本路径正确且无语法错误,但每次运行docker-compose up --build -d等命令时脚本都未执行。我尝试过删除本地db-data目录,但问题仍未解决,恳请各位提供帮助。


解决方案
  • 检查脚本挂载权限
    宿主机上的./data/init.sql可能权限不足,导致PostgreSQL容器内的postgres用户(UID 999)无法读取。执行以下命令调整权限:

    chmod 644 ./data/init.sql
    # 或者直接修改文件所属用户
    sudo chown 999:999 ./data/init.sql
    
  • 确保数据库是首次初始化
    PostgreSQL仅在/var/lib/postgresql/data/目录为空时才会执行/docker-entrypoint-initdb.d/下的脚本。彻底清理本地数据目录并重启容器:

    # 停止并删除容器及关联卷
    docker-compose down -v
    # 手动删除本地挂载目录(如果需要)
    sudo rm -rf ./db-data/postgres/
    # 重新构建并启动
    docker-compose up --build -d
    
  • 查看容器日志定位问题
    查看PostgreSQL容器的日志,确认脚本是否被加载或执行出错:

    docker-compose logs postgres
    

    日志中会明确提示权限问题、SQL语法错误等信息,帮助快速定位。

  • 添加服务依赖确保启动顺序
    你的Go服务可能在PostgreSQL完成初始化前就启动,导致误判脚本未执行。在rinha服务中添加依赖配置,等待PostgreSQL健康后再启动:

    rinha:
      # 其他配置不变
      depends_on:
        postgres:
          condition: service_healthy
    
  • 直接在容器内验证脚本
    跳过初始化流程,直接在运行的PostgreSQL容器内执行脚本,验证脚本本身是否正常:

    docker-compose exec postgres psql -U postgres -d rinha -f /docker-entrypoint-initdb.d/init.sql
    

    如果执行失败,会直接输出错误细节,方便排查语法或逻辑问题。


内容的提问来源于stack exchange,提问作者dornzak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:22:43