gpt4 book ai didi

docker - 如何使用elixir phoenix版本和指南中的示例MyApp.Release.rollback在Docker容器中回滚数据库

转载 作者:行者123 更新时间:2023-12-02 18:50:48 25 4
gpt4 key购买 nike

当尝试通过在Docker容器中运行的phoenix应用程序执行数据库操作时,我无法弄清楚如何回滚数据库。我正在尝试在本地模拟在远程服务器上进行迁移时的状态。

我通过运行以下命令在本地运行:

docker run -it -p 4000:4000 -e DATABASE_URL=ecto://postgres:postgres@host.docker.internal/my_app_dev -e SECRET_KEY_BASE=blahblah my-app-tag:v1

我通过以下方式查看正在运行的容器:
docker ps

我扑向容器
docker exec -it 8943918c8f4f /bin/bash

cd变成 app/bin
cd bin

尝试回滚
./my_app rpc 'MyApp.Release.rollback(MyApp.Repo, "20191106071140")'

=> 08:43:45.516 [info] Already down

如果在应用程序中运行时确实可以正常工作,那么当我做其他事情时,它应该会崩溃。但事实并非如此。

如果我尝试评估
./my_app eval 'MyApp.Release.rollback(MyApp.Repo, "20191106071140")'

=>

08:46:22.033 [error] GenServer #PID<0.207.0> terminating
** (RuntimeError) connect raised KeyError exception: key :database not found. The exception details are hidden, as they may contain sensitive data such as database credentials. You may set :show_sensitive_data_on_connection_error to true when starting your connection if you wish to see all of the details
(elixir) lib/keyword.ex:393: Keyword.fetch!/2
(postgrex) lib/postgrex/protocol.ex:92: Postgrex.Protocol.connect/1
(db_connection) lib/db_connection/connection.ex:69: DBConnection.Connection.connect/2
(connection) lib/connection.ex:622: Connection.enter_connect/5
(stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
Last message: nil
** (EXIT from #PID<0.163.0>) shutdown

我正在尝试确保我知道如何将应用程序部署到远程(Heroku,AWS),并在每次部署时使应用程序自动迁移,还可以选择运行命令以一次回滚1个步骤。

我找不到任何信息。上面的调试是在远程服务器上创建此迁移/回滚功能的第一步,但首先要在本地计算机上进行测试。

迁移/回滚代码直接从 https://hexdocs.pm/phoenix/releases.html#ecto-migrations-and-custom-commands获取

任何帮助/方向将不胜感激。

谢谢

最佳答案

首先,rpc调用应该成功。在运行my_app rpc之前,请确保您确实有问题的迁移。 注意,第二个参数是要还原到的版本,而不是要还原的迁移。

关于eval。在尝试访问其配置之前,应先start或至少load该应用程序。根据documentation:

You can start an application by calling Application.ensure_all_started/1. However, if for some reason you cannot start an application, maybe because it will run other services you do not want, you must at least load the application by calling Application.load/1. If you don't load the application, any attempt at reading its environment or configuration may fail. Note that if you start an application, it is automatically loaded before started.



为了使迁移成功,需要启动 Ecto复制 Ecto.Adapters.SQL.Application 并加载您的应用程序(以访问配置)。

也就是说,这样的事情应该起作用。

def my_rollback(version) do
Application.load(:my_app)
Application.ensure_all_started(:ecto_sql)
Ecto.Migrator.with_repo(MyApp.Repo,
&Ecto.Migrator.run(&1, :down, to: version))
end

并称之为
./my_app eval 'MyApp.Release.my_rollback(20191106071140)'

不过, rpc应该立即启动所需的应用程序(根据您收到的消息,确实可以启动所需的应用程序),所以我建议您对要进行向下迁移的迁移进行三重检查,然后通过降级到的正确版本。

关于docker - 如何使用elixir phoenix版本和指南中的示例MyApp.Release.rollback在Docker容器中回滚数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60786011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com