首页 > 解决方案 > Docker 上的 Rails 无法启动 - execjs 找不到 JavaScript 运行时(节点)

问题描述

我正在构建我的 rails 6.1.3.1 应用程序的 docker 版本。原始应用程序在带有 Node 的 Ubuntu 20.04.2 上运行良好,我大致从那里进行了设置。

在 Docker 中,Node 通过 NVM 可以正常安装,但不幸的是 Rails 在启动时没有找到它。似乎 Execjs gem 不知何故无法识别它。不过,看看它的源代码并没有帮助

Docker 创建期间的版本和路径检查按预期运行且没有错误。

非常感谢 :)

在这里,您会看到错误消息:

/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'

码头工人文件:

# 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"]

标签: node.jsruby-on-railsbashdockerexecjs

解决方案


我有同样的问题。将 Docker 引擎从 18 升级到 20 后,它得到了解决


推荐阅读