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

Docker开发Elixir伞形应用遇runtime_tools.app未找到问题求解决

解决Docker容器内运行Elixir伞形应用时找不到runtime_tools.app的问题

这种本地正常、容器内报错的情况,大多和容器环境的依赖完整性、代码同步规则或者路径配置有关,下面是几个逐步排查的解决方案:

1. 确认容器内Erlang/OTP安装完整

runtime_tools是Erlang/OTP的核心内置应用,不是第三方依赖,所以首先要确保容器里的Erlang环境是完整的:

  • 进入运行中的容器:docker exec -it <container-id> sh
  • 启动Erlang shell:erl
  • 在shell里输入以下命令检查:
    application:which_applications().
    
    如果输出里没有runtime_tools,说明你用的Docker镜像Erlang安装不完整。建议换用官方维护的Elixir镜像,比如elixir:1.16-erlang-27-alpine或者对应你本地版本的镜像,这类镜像会默认包含完整的Erlang核心应用。

2. 调整docker-sync同步规则,避免覆盖系统Erlang目录

docker-sync如果配置不当,可能会把本地的某些文件同步到容器内的系统目录,导致Erlang的核心应用文件被覆盖或损坏:

  • 打开你的docker-sync.yml配置文件
  • 确保同步规则只包含你的应用代码目录,排除容器内的Erlang/Elixir系统路径。比如只同步项目根目录下的apps/、mix.exs、mix.lock这些关键文件/目录,示例配置片段:
    syncs:
      app-code-sync:
        src: './'
        sync_excludes: ['.git', 'node_modules', '_build', '/usr/lib/erlang', '/opt/elixir']
    
  • 重启docker-sync服务:docker-sync stop && docker-sync clean && docker-sync start

3. 显式设置Erlib路径,确保Elixir能找到Erlang应用

有时候容器内的环境变量配置有问题,Elixir找不到Erlang的lib目录,可以手动指定:

  • 在容器内启动应用前,先执行:
    export ERL_LIBS=/usr/lib/erlang/lib
    
    (路径根据你容器内Erlang的实际安装位置调整,比如有些镜像可能是/opt/erlang/lib)
  • 再运行mix phx.server尝试启动

4. 重新在容器内编译依赖

docker-sync同步过来的只是本地的源码,容器内可能没有正确编译依赖,尤其是伞形应用的子应用依赖:

  • 进入容器后,先执行:
    mix deps.get --umbrella
    mix deps.compile --umbrella
    
  • 对于Phoenix子应用,还可以再执行mix phx.digest确保静态资源处理正常,然后再启动服务

5. 检查mix.exs中的应用声明

虽然本地环境可能自动加载了runtime_tools,但容器环境下建议显式在应用配置中声明:

  • 打开伞形应用根目录的mix.exs,或者Phoenix子应用的mix.exs,找到application/0函数,确保:runtime_tools在:extra_applications列表中:
    def application do
      [
        mod: {MyUmbrellaApp.Application, []},
        extra_applications: [:logger, :runtime_tools, :os_mon]
      ]
    end
    
  • 同步修改后的文件到容器,然后重新启动服务

内容的提问来源于stack exchange,提问作者Ole Spaarmann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:57:53