mikl

mikl

Mix deps.get memory explosion when doing cross-platform Docker build

I’m trying to do a cross-platform build for a Phoenix app, so on my ARM macOS, I’m running

docker buildx build --platform linux/amd64 [more, less relevant options] .

The relevant part of the Dockerfile contains:

FROM hexpm/elixir:1.15.2-erlang-26.0.2-ubuntu-focal-20230126 AS build-stage

# install build dependencies
RUN apt-get update -y && apt-get install -y build-essential git \
    && apt-get clean && rm -f /var/lib/apt/lists/*_*

# prepare build dir
WORKDIR /app

# install hex + rebar
RUN mix local.hex --force && \
    mix local.rebar --force

# set build ENV
ENV MIX_ENV="prod"

# install mix dependencies
COPY mix.exs mix.lock ./
RUN mix deps.get --only $MIX_ENV

When it reaches the RUN mix deps.get line, it blows up after a brief moment with BEAM running out of memory:

 => ERROR [build-stage  6/17] RUN mix deps.get --only prod                                                                             3.5s
------
 > [build-stage  6/17] RUN mix deps.get --only prod:
3.040 no next heap size found: 2305842975251512930, offset 0
3.045
3.045 Crash dump is being written to: erl_crash.dump...done
3.483 qemu: uncaught target signal 6 (Aborted) - core dumped
3.493 Aborted
------
Dockerfile:22
--------------------
  20 |     # install mix dependencies
  21 |     COPY mix.exs mix.lock ./
  22 | >>> RUN mix deps.get --only $MIX_ENV
  23 |     RUN mkdir config
  24 |
--------------------

Things I’ve already tried:

  1. Omitting --platform linux/amd64 makes the memory explosion go away. But then the binaries built will be Aarch64 which won’t run on an x64 Linux server.
  2. Skipping --only prod makes no difference, getting the deps still has a memory explosion.

I understand this is not a common thing to do, but if someone has an idea on how to solve this, I’d be grateful.

Marked As Solved

pdgonzalez872

pdgonzalez872

hi @mikl! I was reading a thread a while back that may help you:

Could you please try that out and report back? Thanks!

Also Liked

mikl

mikl

Wow, that’s quite the rabbit hole.

I’m very happy to report that adding ENV ERL_FLAGS="+JPperf true" to the build-section of my Dockerfile fixes this.

Thanks, @pdgonzalez872.

(To anyone else needing this workaround, if you consult the Erlang docs for that flag, this is indeed recommended as a workaround for Qemu-specific problems, not something you should have set on your server).

10
Post #3
fteschke

fteschke

It is probably sufficient to use +JMsingle instead of +JPperf

mix release — Mix v1.20.2
However, when building such images on your machine, those technologies use emulation which may not interplay well with Erlang VM’s JIT (just-in time) compiler. To address this, you can set this environment variable on your build stage:
ENV ERL_AFLAGS “+JMsingle true”

erl — OTP 29.0.2 (erts 17.0.2)
+JMsingle: This flag is automatically enabled by the +JPperf flag.

Where Next?

Popular in Questions Top

New
senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New
JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
mgjohns61585
Could someone help me? I’m making my first elixir program, number guessing game. I can’t figure out how to convert the user’s guess from ...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
Emily
I have VueJS GUIs with the project generated using Webpack. I have Elixir modules that will need to be used by the VueJS GUIs. I forese...
New
aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
New
chensan
I have a User schema with a :from_id field set to type :string: defmodule TweetBot.Repo.Migrations.CreateUsers do use Ecto.Migration ...
New
komlanvi
Hi everyone, I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New

Other popular topics Top

sen
Hi All, I set a environment variables in dev.exs , like below code. when i start server, how can i set the ${enable} value? thanks. d...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
chrismccord
This release brings a number of exciting features, including integration with the new Phoenix LiveDashboard and Phoenix LiveView. There h...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
New
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New

We're in Beta

About us Mission Statement