🍩

Dockerfile内で.bash_profileを反映させる

2024/05/19に公開

概要

dockerのimageをbuildするとき、rbenvやnvmなどをインストールしてrubyやnodeを入れようとしたけどsource ~/.bash_profileをやってもrbenvnvmコマンドが見つからない時。

結論

ひとつの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