🚰
Docker コンテナ上で ~/.bashrc が実行されない場合でも node にPATHを通す方法
やりたいこと
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
参考
Discussion