【问题标题】:Ecto.reset inside docker container does not workdocker 容器内的 Ecto.reset 不起作用
【发布时间】:2018-08-05 02:16:21
【问题描述】:

我正在使用 Phoenix 和 PostgreSQL 构建一个 RESTful API,并使用 docker-compose 在单独的 docker 容器中运行 Phoenix 应用程序和数据库。如果我将外壳附加到 Phoenix 容器并键入 mix ecto.reset 以重置数据库,则会收到以下错误:

** (Mix) The database for Home.Repo couldn't be dropped: ERROR 55006 (object_in_use): 
database "home" is being accessed by other users

There are 10 other sessions using the database.

我已经试过了:

REVOKE CONNECT ON DATABASE dbname FROM PUBLIC, username;

SELECT 
    pg_terminate_backend(pid) 
FROM 
    pg_stat_activity 
WHERE 
    pid <> pg_backend_pid()
    AND datname = 'database_name';

我做错了什么?

【问题讨论】:

  • 可能cowboy 持有一个与您的数据库的连接池。尝试在重置数据库之前停止它。
  • @NicNilov 你是对的,我停止了 Phoenix 容器并尝试使用 DROP DATABASE 从 postgres 容器中手动删除数据库并且它有效。但是我怎样才能只停止 Phoenix 内的牛仔网络服务器容器,所以我可以使用 mix ecto.reset?
  • 在运行mix ecto.reset 之前,您必须从容器的shell 中终止您的beam 进程,然后使用mix phx.server 重新启动服务器。

标签: postgresql docker elixir phoenix-framework ecto


【解决方案1】:

在这种情况下,您不应该只停止牛仔网络服务器,因为它需要重新启动许多 phoenix 依赖项,并且如果您找到并自己杀死它,很可能会有一个监督树来恢复进程。因此,如前所述,您应该在 iex 中使用 Application.stop(:your_app) 停止整个 phoenix 服务器,然后执行 ecto.reset 并重新启动它。

尽管您不需要在正在运行的应用程序中使用 ecto reset,但 ecto.reset 执行以下操作:"ecto.drop", "ecto.create", "ecto.migrate"。您应该检查 drop 是否真的有必要,因为在依赖数据库的正在运行的应用程序中这是不可能做到的。

例如,如果您出于测试目的而重置,那么您还应该检查 Ecto.Sandbox,它会为每个测试设置一个副本数据库: https://hexdocs.pm/ecto/Ecto.Adapters.SQL.Sandbox.html#content

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 2017-01-18
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多