🚰

Docker コンテナ上で ~/.bashrc が実行されない場合でも node にPATHを通す方法

2024/10/02に公開

やりたいこと

nodenvはインストールの過程で ~/.bashrc にPATHやevalを追記するが、
bash -c '...' で実行されるコマンドは ~/.bashrc を通らないため、nodeが使えないことがある。

そこで、~/.bashrc を実行せずともnodeにPATHを通して実行できるようにした。

例えば、Railsサーバーの起動の際には下記のようなコマンドをdocker-compose.ymlに書くことが多い。
このようなケースでもnodeにPATHを通すのが今回の目的。

/bin/bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b 0.0.0.0"

注) nodenvの基本的な入れ方、使い方はggればたくさん転がっているので、そちらを参照してください

やること

  • SHELLをbashにしておく
  • git, curlを入れる
  • git cloneでnodenvを持ってきてインストール
    • node-buildも入れる
  • nodenv installとnodenv globalを叩く
  • /root/.nodenv/shims/ をPATHに追加しておく
    • bash -cで実行されたコマンドは、~/.bashrc が実行されないため
    • bash -c 'source ~/.zshrc && ...' と書くことでも解決できるが、毎回書くのは面倒…

Dockerfile

FROM ruby:3.3.3-slim-bookworm
ARG NODE_VERSION=20.17.0

SHELL ["/bin/bash", "-c"]

RUN apt update && \
    apt install -y git curl
RUN git clone https://github.com/nodenv/nodenv.git ~/.nodenv && \
    echo 'export PATH="$HOME/.nodenv/bin:$PATH"' >> ~/.bashrc && \
    echo 'eval "$(nodenv init -)"' >> ~/.bashrc && \
    source ~/.bashrc && \
    git clone https://github.com/nodenv/node-build.git $(nodenv root)/plugins/node-build && \
    nodenv install ${NODE_VERSION} && \
    nodenv global ${NODE_VERSION}
ENV PATH /root/.nodenv/shims/:$PATH

インストール結果の確認

$ docker compose run --rm web bash -c 'node -v'
[+] Creating 1/0
 ✔ Container [=== 検閲済 ===]  Running      0.0s
v20.17.0

参考

https://qiita.com/niisan-tokyo/items/b104f46edf793c827c12

Discussion