使用Distillery构建发布包时报`Unable to configure release!`错误如何解决?
你当前的报错和appup构建无关,是启动发布包时运行时配置加载失败导致的,核心有两处错误:
1. 运行时配置变量未定义
你使用的config/releases.exs中直接调用了database_url和secret_key_base两个变量,但没有提前从环境变量读取赋值,运行时变量未定义会直接抛出异常,导致配置加载流程中断。
需要在配置开头补充变量读取逻辑:
import Config # 补充这两行 database_url = System.fetch_env!("DATABASE_URL") secret_key_base = System.fetch_env!("SECRET_KEY_BASE") # 原有配置逻辑 config :acompanhante, Acompanhante.Repo, adapter: Ecto.Adapters.Postgres, ssl: true, url: database_url, pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10") # ...其余原有配置
本地测试不需要强制校验环境变量的话,可以用System.get_env/2设置默认值:
database_url = System.get_env("DATABASE_URL", "postgres://postgres:postgres@localhost:5432/acompanhante_dev") secret_key_base = System.get_env("SECRET_KEY_BASE", "dt90Q3jEa4sF6gH7jK8lZ0xM2nP4qR6tU8vW0yZ2c4vB6nM8pQ0sT2wY4aS6dF8")
2. dev环境配置不匹配
你当前启动的是dev环境的发布包,你在environment :dev块中开启了dev_mode: true,Distillery的dev模式默认会跳过release块中配置的overlay拷贝操作,你定义的{:copy, "config/releases.exs", "etc/config.exs"}规则不会生效,导致发布包${RELEASE_ROOT_DIR}/etc/目录下不存在config.exs文件,配置提供者找不到目标文件直接报错。
两种修复方案按需选择:
- 测试正式发布逻辑:构建prod环境的发布包启动,不要使用dev环境的发布包
- 必须使用dev环境发布:手动将
config/releases.exs拷贝到_build/dev/rel/acompanhante/etc/config.exs路径,或者关闭dev环境的dev_mode配置
可选优化
如果运行时配置只需要在生产环境生效,可以把config_providers和overlays配置挪到environment :prod块中,避免对dev环境产生影响:
environment :prod do set include_erts: true set include_src: false set cookie: :"OzWR<VV9?T=2o=F@9KxRTTm|CIGO/BoT9p_^D/QN6CY3}v<4?;yRjhR(v^nz1fvR" set vm_args: "rel/vm.args" # 新增以下两行 set config_providers: [{RuntimeConfig, ["${RELEASE_ROOT_DIR}/etc/config.exs"]}] set overlays: [{:copy, "config/releases.exs", "etc/config.exs"}] end release :acompanhante do set version: current_version(:acompanhante) set applications: [ :runtime_tools, :logger ] end
内容的提问来源于stack exchange,提问作者Allan Duarte
相关产品推荐
相关产品推荐

