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目录,可以手动指定:
- 在容器内启动应用前,先执行:
(路径根据你容器内Erlang的实际安装位置调整,比如有些镜像可能是export ERL_LIBS=/usr/lib/erlang/lib/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
相关产品推荐
相关产品推荐

