如何在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
相关产品推荐
相关产品推荐

