質問: ### Workspace内のバージョンを変更したい。 vpsサーバにlaradockを利用してlaravelの環境(nginx・mysql)を構築しました。 ただ、Workspace内のnode.jsのバージョンがv9.9だったため、nodebrewをインストールして安定版であるv8.10に変更して、バージョンが変更された事も確認出来たのですが、暫く時間が経つとまたv9.9になってしまいます。 どこか、設定ファイル等に記述があり、この方法では変更出来ないのでしょうか。 はたまた、ここでnode.jsのバージョンを変更しようとしている事は間違っているのでしょうか。 dockerに詳しい方ご教示宜しくお願いします。 さくらvpsにdocker-composeをインストールし、laradockのプロジェクトファイルを一式var/www配下にアップロードし、build及びupして、nginx,mysql,php-fpm,workspaceが立ち上がっている状態。 ・laradockディレクトリに移動 ``` # cd var/www/laradock ``` ・Workspaceに入る ``` # docker-compose exec workspace bash ``` ``` # node -v ``` ここではnodeはv9.9.0 ・nodebrewでバージョン変更する為にnodebrewをインストール ``` # curl -L git.io/nodebrew | perl - setup ``` ``` # export PATH=$HOME/.nodebrew/current/bin:$PATH ``` ・nodebreでバージョン変更 ``` # nodebrew use stable ``` ``` # node -V ``` 確認するとnodeはv8.1.0になっている ・一旦Workspaceからログアウトして、再度Workspaceに入る。 ``` exit ``` ``` # docker-compose exec workspace bash ``` すると、nodebrewコマンドも使えなくなり、バージョンも9.9に戻っている...
回答: 一言いっておかなければならない事があります。 「Dockerはそういう使い方するものじゃないから!!!」 それとは別に、今回の件の動作に関してはLinuxの根本の挙動に関係する所なので 別途解説していきます。 > > なぜnodebrewコマンドが利用出来ていないのか? > > > `export PATH=$HOME/.nodebrew/current/bin:$PATH`この1文が原因です。 これはLinuxやUnixのシェルとして動作するBashの書き方です。 「今ログインしているユーザーの環境変数PATHを右辺の文字列で再代入してくれ」という意味があります。 BashのPATHは`:`という区切り文字で区切るルールがあり、 `xxxx:$PATH`という書き方をした場合、 既存のPATHはそのままに左側に新しいPATHを追加してくださいという意味になります。 ``` $ export PATH=$HOME/.nodebrew/current/bin:$PATH # 環境変数PATHを出力してみます、恐らくこんな感じのPATHになっていることでしょう $ echo $PATH /root/.nodebrew/current/bin:xxxx:xxxx:xxxx ``` しかし、このexportは**今ログインしているユーザー**と説明しました。 つまり再度ログインし直すとこの設定は消し飛びます。 なので、nodebrewコマンドを再度有効にしたければ、 **ログインする度に`export PATH=$HOME/.nodebrew/current/bin:$PATH`を実行してください**。 まじかよ、そんな面倒な事したくないぞ...というわけで、 `~/.bashrc`というログインする度に上から順番にコマンドとして実行してくれるファイルがBashには用意されています。 此処までは一般的なLinuxやUnixの話です。 Dockerではコンテナ内の`.bashrc`に書き込んでも無駄です。 Linuxマシンは複数ユーザーがログイン出来る仕様になっていますからね。 貴方が別枠のユーザーとしてログインして`export PATH=$HOME/.nodebrew/current/bin:$PATH`を実行しても、 **別のユーザーであるdocker-composeを利用して立ち上がったロボットのユーザー**には何も影響がありません。 > > はたまた、ここでnode.jsのバージョンを変更しようとしている事は間違っているのでしょうか。 > > > 結論から言うと間違っています。 DockerのコンテナはImageから一時的に複製された実体です。 `docker-compose stop; docker-compose rm -f`で終了したら消える儚い命なのです。 ですので、コンテナの内部でNode.jsの安定版をインストールして展開しても無駄です。 変更したければDockerfileの方を修正してください。 ちょっと私と一緒に追ってみましょうか。 まず、質問文にあったようにLaradock/docker-compose.ymlを確認します。 workspaceのNode.jsのバージョンを落としたいんでしたっけ? なら、この辺の記述が該当するでしょう。 ``` workspace: build: context: ./workspace args: - INSTALL_XDEBUG=${WORKSPACE_INSTALL_XDEBUG} - INSTALL_BLACKFIRE=${INSTALL_BLACKFIRE} - INSTALL_SOAP=${WORKSPACE_INSTALL_SOAP} # パラメータが多すぎるので割愛 dockerfile: "Dockerfile-${PHP_VERSION}" ``` 環境変数のPHP_VERSIONに依存するようにDockerfileが決定されるようですが、 ここでは/workspace/Dockerfile-72にスポットを当ててみましょうか。 最初に元になったイメージの`FROM laradock/workspace:2.0-72`ってなんやねん? laradock/workspace - DockerHubで公開されていましたね。 こんな感じでDockerHubで追えば分かるのでたどってみてください。 因みに更に辿ってphusion/baseimageも調べた所、どうやらピュアなubuntuのようですね。 まぁ、Dockerfile-72の305行目以降の一連の流れを見る限り、 どうやらnodebrewではなくnvmというバージョン管理ソフトを使ってstableを導入しようとしているみたいですね。 此処のバージョンをstableという文字列から、固定文字列の`v8.1.0`に変更して上げる事で、 狙ったバージョンのImageを作れるようになるんじゃないでしょうか? docker-composeでビルドしなおしてみてください。 ``` # 消したいイメージを探す $ docker images ubuntu latest 20c44cd7596f 4 months ago 123MB # IDの上部数文字を打ち込んで削除 $ docker rmi -f 20c44 $ docker-compose build $ docker-compose up -d workspace $ docker-compose exec workspace bash # node -v ```