Docker部署Rails应用无法重置PostgreSQL数据库求助
解决Docker环境下Rails数据库重置的连接占用问题
以下是几种无需让容器崩溃就能完成数据库重置的方法:
方法一:临时停止关联容器(最简单)
因为Sidekiq和主Rails应用容器都在连接Postgres,直接停掉这两个容器再重置:
- 停止Rails应用和Sidekiq容器(保留Postgres、Redis运行):
docker-compose stop app sidekiq - 用临时容器执行数据库重置(不用启动原app容器):
docker-compose run --rm app rails db:migrate:reset - 重启刚才停掉的容器:
docker-compose start app sidekiq
方法二:在Postgres容器内强制断开活跃连接
不用停任何容器,直接在Postgres里踢掉其他会话:
- 进入Postgres容器的SQL控制台(替换
<你的Postgres用户名>,默认是postgres):docker-compose exec db psql -U <你的Postgres用户名> postgres - 查看当前连接到目标数据库的会话:
SELECT pid, usename, datname FROM pg_stat_activity WHERE datname = 'my_app_development'; - 断开这些会话(排除当前控制台自己的连接):
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'my_app_development' AND pid <> pg_backend_pid(); - 输入
\q退出控制台,然后执行重置:
注:Rails和Sidekiq会自动重新建立数据库连接,只会有极短暂的连接错误,不会导致容器崩溃。docker-compose exec app rails db:migrate:reset
方法三:一键执行(适合脚本化)
把断开连接和重置合并成一条命令,省去手动进入Postgres的步骤:
docker-compose exec db psql -U postgres postgres -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'my_app_development' AND pid <> pg_backend_pid();" && docker-compose exec app rails db:migrate:reset
注意事项
- 确保替换命令中的
<你的Postgres用户名>和my_app_development为你实际的配置,可查看docker-compose.yml里的POSTGRES_USER、POSTGRES_DB字段。 - 强制断开连接后,正在执行的请求可能会报错,但应用会自动恢复,不会影响容器运行。
内容的提问来源于stack exchange,提问作者A. Vreeswijk
相关产品推荐
相关产品推荐

