运行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
相关产品推荐
相关产品推荐

