Techioz Blog

Ruby on Rails でアセットのコンパイルを実行すると、Node.js がインストールされていないために Docker が失敗する

概要

docker-compose up を実行しようとしていますが、次の行でエントリポイントを実行しているときに実行されます。

バンドル実行 RAKE アセット:プリコンパイル RAILS_ENV=production

エラー: Node.js がインストールされていません。 Node.js https://nodejs.org/en/download/ をダウンロードしてインストールしてください。

私のDockerfileはノードをインストールするので、何が問題なのかわかりません。

さまざまな Docker ファイル設定を試しましたが、同じエラーが発生し続けます。誰かがそれを修正する方法を見てもらえますか?前もって感謝します。

Docker ファイル:

# syntax=docker/dockerfile:1
FROM ruby:3.0.4

ENV NODE_OPTIONS="--openssl-legacy-provider"


RUN apt-get update -qq && \
    apt-get install -y nodejs postgresql-client python curl apt-transport-https && \
    curl -fsSL https://deb.nodesource.com/setup_14.x | bash - && \
    apt-get install -y nodejs && \
    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
    apt-get update && \
    apt-get install -y yarn

WORKDIR /eclipse
COPY Gemfile /eclipse/Gemfile
COPY Gemfile.lock /eclipse/Gemfile.lock
RUN bundle install

RUN echo "Install webpacker ----"
RUN bundle exec rails webpacker:install \
    rails webpacker:compile

# Entrypoint.sh will be run every time the container starts.
COPY /bin/entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Configure the main process to run when running the image
CMD ["rails", "server", "-b", "0.0.0.0"]

エントリーポイント.sh

#!/bin/bash
set -e

echo "Compile assets ----"
bundle exec rake assets:precompile RAILS_ENV=production

echo "Create database ----"
bundle exec rake db:create

echo "Rake database ----"
bundle exec rake db:migrate

# Remove a potentially pre-existing server.pid for Rails.
rm -f /app/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

解決策

このようなことに直面したとき、私は通常、失敗した行から順にすべてをコメントします。次に、Docker コンテナを起動し、最初にコメントアウトしたものを実行してみます。それは通常、道を示します。

予期していなかったものの古いバージョンをインストールしていることが判明することがよくあります。もちろん、ノード 14 を取り付けることになりますが、この時点では歯内でかなり長いものになります。

特定のケースで、これが新しいアプリである場合は、webpacker を廃止することをお勧めします。既存のアプリの場合は、https://github.com/shakacode/shakapacker に移行することをお勧めします。これは少なくともある程度は保守および更新されています。