So, I have an elixir application that originally came bundled with its own ERTS (in a release) to be run on a specific server.
The original setup was:
- build server: Docker image in CI, elixir 1.14.4, OTP 25.3 (x86_x64 architecture, Rocky Linux)
- included ERTS: Built without some libs (like ncurses not present on target server), but same OTP 25.3
- target server: it is deployed also on a x86_64 architecture but is Ubuntu LTS
This all worked fine until one day the Docker image (which is used by all our build activities, not just the ones related to elixir) started using GLIBC 2.34 and the target server it is deployed to remained at 2.31. Now the ERTS when deployed could no longer find a compatible GLIBC and our release could no longer be started.
So I wanted to solve this by installing Erlang on the target server and no longer bundling ERTS with the release.
include_erts: false,
We verified that Erlang 25.3.2.2 was installed on target server under /lib/erlang, playing around with the erl shell. It seemed to work fine.
But when we unpack the release and do bin/name_of_release start
we get this:
{"init terminating in do_boot",{load_failed,[logger_simple_h,supervisor,proc_lib,lists,logger_backend,logger,logger_server,kernel,filename,gen_server,gen,file_server,erl_parse,file_io_server,file,ets,erl_lint,logger_config,erl_eval,application,code_server,code,application_controller,error_handler,heart,logger_filters,gen_event,error_logger,application_master]}}
Basically the whole Erlang libs are missing. It can find erl
from PATH just fine, but somehow none of the required OTP.
I tried supplying OTPROOT and ERL_LIBS on the command line while running the script, but to no avail.
It’s built for V13.2 (on Docker) and on target it has V13.2.2.5, same CPU architecture.
Any ideas what’s going on?
Thank you.