Failed to load NIF library, symbol not found for libpostal

I am trying to install expostal in a new Elixir project in a container with alpine, and since libpostal exists as a package on alpine, I am just installing it.

❯ docker run --rm -it elixir:alpine sh
/ # apk add build-base libpostal-dev
/ # mix new foobar

# Add {:expostal, "~> 0.2.0"} to the deps.

/foobar # mix deps.get
/foobar # mix deps.compile

/foobar # iex -S mix
iex(1)> Expostal.par(TAB)
13:18:25.440 [warning] The on_load function for module Elixir.Expostal returned:
{{:badmatch,
  {:error,
   {:load_failed,
    'Failed to load NIF library: \'Error relocating /foobar/_build/dev/lib/expostal/priv/expostal.so: libpostal_setup_parser: symbol not found\''}}},
 [
   {Expostal, :init, 0, [file: 'lib/expostal.ex', line: 13]},
   {:code_server, :"-handle_on_load/5-fun-0-", 1,
    [file: 'code_server.erl', line: 1317]}
 ]}


13:18:25.439 [error] Process #PID<0.202.0> raised an exception
** (MatchError) no match of right hand side value: {:error, {:load_failed, 'Failed to load NIF library: \'Error relocating /foobar/_build/dev/lib/expostal/priv/expostal.so: libpostal_setup_parser: symbol not found\''}}
    (expostal 0.2.0) lib/expostal.ex:13: Expostal.init/0
    (kernel 8.5) code_server.erl:1317: anonymous fn/1 in :code_server.handle_on_load/5

I’ve asked this on Elixir Slack and @LostKobraKai had suggested that the NIF compilation is the problem and I should compile it properly. However I am not sure how I would compile it properly so that it’d work on alpine.


Compiling from source and installing on ubuntu:latest and alpine:latest just worked fine. So it means there’s something with the expostal I think.

Not sure which version your Alpine is but maybe try upgrading MUSL?

apk upgrade musl

In any case please make sure you use a fairly modern Alpine version. It’s not a problem to use a non-Elixir based image and just add Erlang and Elixir to a normal Alpine Docker image.

If that doesn’t work maybe you need GNU libc compatibility:

apk add gcompat

But outside of that, not sure.

I’ve tried the latest alpine as well

❯ docker run --rm -it alpine:latest sh
/ # apk add erlang elixir libpostal-dev build-base
/ # mix new foobar

# Then add expostal as dependency compile it and run it

I’ve tried upgrading musl as well as adding gcompat, however I’ve got the same error as I’ve shared in my post.