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

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退出控制台,然后执行重置:
    docker-compose exec app rails db:migrate:reset
    
    注:Rails和Sidekiq会自动重新建立数据库连接,只会有极短暂的连接错误,不会导致容器崩溃。

方法三:一键执行(适合脚本化)

把断开连接和重置合并成一条命令,省去手动进入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:16:15