Rails on Docker won't start - execjs does not find JavaScript runtime (node)

771 views Asked by At

I am building a docker version of my rails 6.1.3.1 app. The original app runs fine on Ubuntu 20.04.2 with Node and I took the setup roughly from there.

In Docker, Node installs fine via NVM but unfortunately Rails does not find it at startup. It seems that the Execjs gem somehow does not recognize it. A look at its sourcecode did not help, though

The version and path checks during Docker creation run as supposed and without errors.

Thanks a lot :)

Here you go with the error message:

/usr/local/bundle/gems/execjs-2.7.0/lib/execjs/runtimes.rb:58:in `autodetect': Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
    from /usr/local/bundle/gems/execjs-2.7.0/lib/execjs.rb:5:in `<module:ExecJS>'
    from /usr/local/bundle/gems/execjs-2.7.0/lib/execjs.rb:4:in `<main>'
    from /usr/local/bundle/gems/bootsnap-1.7.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'

... etc. ...

    from /usr/local/bundle/gems/spring-2.1.1/lib/spring/application.rb:139:in `run'
    from /usr/local/bundle/gems/spring-2.1.1/lib/spring/application/boot.rb:19:in `<top (required)>'
    from /usr/local/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
    from /usr/local/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'

The dockerfile:

# Dockerfile
# Use ruby image to build our own image
FROM ruby:2.6.6
# We specify everything will happen within the /app folder inside the container
WORKDIR /app
# We copy these files from our current application to the /app container
COPY Gemfile Gemfile.lock ./

# install Node with NVM
# was a pain to make nvm run after install then followed https://stackoverflow.com/a/60137919/10297304
SHELL ["/bin/bash", "--login", "-i", "-c"] # different way of execution sources .bashrc..
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.0/install.sh | bash
SHELL ["/bin/bash", "--login", "-c"] # back to normal
RUN nvm install 14.15.0
RUN nvm alias default v14.15.0
RUN npm install --global yarn
RUN gem install bundler:2.2.11 # otherwise version mismatch
RUN bundle install
RUN yarn install
RUN which node
RUN node -v
RUN nvm -v
RUN yarn -v
# We copy all the files from our current application to the /app container
COPY . .
# We expose the port
EXPOSE 3000
# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
1

There are 1 answers

0
dario On

I had the same problem. After upgrading the Docker engine from 18 to 20 it was solved