🍩
Dockerfile内で.bash_profileを反映させる
概要
dockerのimageをbuildするとき、rbenvやnvmなどをインストールしてrubyやnodeを入れようとしたけどsource ~/.bash_profile
をやってもrbenv
やnvm
コマンドが見つからない時。
結論
ひとつのRUNの中でやるとsourceが反映されます。
# rubyをインストール
RUN <<EOF
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'eval "$(~/.rbenv/bin/rbenv init - bash)"' >> ~/.bash_profile
source ~/.bash_profile
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install 3.2.0
rbenv global 3.2.0
EOF
RUNを抜けたらまたsource ~/.bash_profile
をやればまた見つかります。
# passengerをインストール
RUN <<EOF
source ~/.bash_profile
gem install passenger
sudo passenger-install-apache2-module --languages ruby --auto
EOF
解説(言い訳)
DockerfileのbuildはRUNなどの各インストラクション毎にキャッシュされるので可能な限り細かく分けて書いてました。先ほどのrubyのインストールでいうとこんな感じ。
RUN git clone https://github.com/rbenv/rbenv.git ~/.rbenv
RUN echo 'eval "$(~/.rbenv/bin/rbenv init - bash)"' >> ~/.bash_profile
RUN source ~/.bash_profile
RUN git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
RUN rbenv install 3.2.0
RUN rbenv global 3.2.0
これだとrbenvが見つからないといってエラーになります。ネットで探したら下記のようにインストールしてる人がいました。
RUN ~/.rbenv/bin/rbenv install 3.2.0
RUN ~/.rbenv/bin/rbenv global 3.2.0
これでもできるのですがnvmはどこにあるの?ってみると
which nvm
{
...
nvm --help 1>&2;
nvm_echo;
nvm_err_with_colors "\033[1;37mPlease pass in five \033[1;31mvalid color codes\033[1;37m. Choose from: rRgGbBcCyYmMkKeW\033[0m";
fi
;;
*)
nvm --help 1>&2;
return 127
;;
esac
}
こんな感じのソースコードが・・・困った挙句色々みてたら発見しました。
Discussion