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

如何在Postgres容器启动后运行bash脚本?启动失败问题求助

Postgres容器启动后执行初始化脚本的解决方案

问题分析

你用command参数指定执行自定义脚本时,覆盖了Postgres镜像的默认启动命令,导致Postgres数据库服务根本没启动就直接跑脚本,自然会出现无法连接Unix socket的错误。移除command后容器正常启动,说明默认启动逻辑是没问题的。

正确解决方案:利用Postgres初始化脚本机制

Postgres官方镜像提供了自动执行初始化脚本的功能:容器启动时,会自动运行/docker-entrypoint-initdb.d/目录下的.sh、.sql、.sql.gz文件,且这些脚本会在数据库初始化完成、服务就绪后执行,完全符合你的需求。

步骤1:修改docker-compose.yml的db服务配置

去掉command参数,把本地脚本挂载到/docker-entrypoint-initdb.d/目录,而不是/tmp。修改后的db服务配置如下:

db:
  image: postgres:13-alpine
  volumes:
    - postgres_data:/var/lib/postgresql/data/
    # 把本地脚本目录挂载到Postgres初始化目录
    - "/Users/theComputerPerson/:/docker-entrypoint-initdb.d/"
  expose:
    - 5432
  environment:
    - POSTGRES_USER=fastapi_traefik
    - POSTGRES_PASSWORD=fastapi_traefik
    - POSTGRES_DB=fastapi_traefik

步骤2:调整newtable.sh脚本

确保脚本用正确的用户和数据库连接执行命令,示例脚本如下:

#!/bin/bash
set -e

# 创建表
psql -U fastapi_traefik -d fastapi_traefik -c "
CREATE TABLE IF NOT EXISTS your_table_name (
    id SERIAL PRIMARY KEY,
    column1 VARCHAR(255),
    column2 INT
);
"

# 导入CSV文件(假设CSV在挂载的目录下,路径为/docker-entrypoint-initdb.d/your_data.csv)
psql -U fastapi_traefik -d fastapi_traefik -c "
COPY your_table_name (column1, column2)
FROM '/docker-entrypoint-initdb.d/your_data.csv'
DELIMITER ','
CSV HEADER;
"

注意事项

  • 确保脚本有可执行权限:本地执行chmod +x newtable.sh
  • CSV文件要和脚本放在同一个本地目录,这样挂载后能被容器访问到
  • 脚本中可以直接用容器环境变量增强灵活性,比如改成:
    psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -c "..."
    

这样配置后,容器启动时会先正常启动Postgres服务,完成初始化后自动执行你的脚本,创建表并导入CSV数据,不会再出现连接错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:50:33