为了在启动PostgreSQL容器后创建数据库并退出,你可以在运行PostgreSQL容器时通过命令行参数或者环境变量传递SQL命令给PostgreSQL初始化脚本。然而,直接在启动脚本中执行这一操作并不直观且可能不可靠,更好的方式是在FastAPI容器启动后,通过其内部逻辑连接数据库并创建所需的数据库。
但如果你坚持要在启动脚本中完成这一任务,可以尝试如下方法(这里假设你知道如何安全地在脚本中嵌入密码):
#!/bin/bash
# ... (previous configurations)
# Run the PostgreSQL container and create the database
PG_DATABASE="fast_web"
PG_INIT_SCRIPT="/path/to/pg_init.sql" # Contains 'CREATE DATABASE fast_web;'
docker run -d \
--name $PG_CONTAINER_NAME \
--network=my_network \
-p $PG_PORT:5432 \
-v pg_data:/var/lib/postgresql/data \
-e POSTGRES_USER=$PG_USER \
-e POSTGRES_DB=$PG_DATABASE \
-e POSTGRES_INITDB_ARGS="--auth-host=md5 -c 'shared_preload_libraries=pg_stat_statements'" \
-e POSTGRES_PASSWORD=your_password \
-v $PG_INIT_SCRIPT:/docker-entrypoint-initdb.d/init.sql \
postgres
# ... (continue with running FastAPI container)
# 注意:在生产环境中,你应该避免硬编码密码,并考虑使用安全的方式来存储和传递敏感信息。
在这个脚本中,我们添加了POSTGRES_DB
环境变量来自动创建数据库,还挂载了一个包含CREATE DATABASE
命令的初始化脚本到/docker-entrypoint-initdb.d/
目录下,这样当数据库首次启动时,会自动执行该脚本创建数据库。
然而,请注意这种方法依赖于PostgreSQL的docker-entrypoint行为,且仅在首次初始化数据库时有效。后续重启容器不会再次执行初始化脚本。对于数据库结构或数据的变更,应在FastAPI应用内编写逻辑进行处理。