質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.20%

laradock環境でWorkspace内のnodeのバージョンが変更出来ない。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,685

chikuwanabe

score 12

 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に戻っている...

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • xenbeat

    2018/03/28 01:57 編集

    ここだと見にくい上に他の回答者に共有する意味でも、ここの「質問への追記・修正の依頼」ではなく「質問文」に具体的に実行したコマンドそしてその結果(エラー、バージョン等)一連の手順を明記ください。nodebrewも使えなくなっていた、Workspaceから出て再度入り直す(compose stopしていない?)等が曖昧です。

    キャンセル

  • xenbeat

    2018/03/28 02:01 編集

    誰しも質問者さんと全く同じ環境を持っているわけではないので、質問者さん環境、そこで具体的にやったこと(一連の手順)、そしてそこで発生したエラーが情報として最低限必要なのです。面倒かもしれませんがご理解ください。

    キャンセル

  • chikuwanabe

    2018/03/28 09:46

    ご指摘有難う御座います。ここでの質問に慣れていなかった為コメント欄でやり取りしてしまいました。。申し訳ないです。以後「質問文」の方に追記致します。環境に関しましても承知致しました。

    キャンセル

回答 2

+1

exportコマンドでPATHを設定しているのでexit時に消えているのでしょう。
どうしてもnodebrewでないといけないんだという特別な理由があるのなら、Dockerfileをカスタマイズしたり、スクリプトを書かないといけないのですが、
特にnodebrew自体にはこだわりがなく、nodeのバージョン管理ツールで好きなnodeのバージョンをインストールしたいということでしたらlaradockがその仕組みをnvmで提供しているようなのでそのお作法に従った方が良いでしょう。
そのあたりの知識がないならなおさらです。
以下参考にされてください。

// nodeのインストール設定
http://laradock.io/documentation/#install-node-nvm

// nodeのバージョン設定
https://github.com/laradock/laradock/blob/master/env-example#L96

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/28 15:03

    諸々本当にありがとうございました!
    laradock内の仕組みを確認してみます。

    キャンセル

checkベストアンサー

0

一言いっておかなければならない事があります。
「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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/28 15:07

    「Dockerはそういう使い方するものじゃないから!!!」
    分かりやすい一言有難う御座います!
    色々設定している間につい普通にサーバをイジってる感覚になってしまっていました..詳しく書いて頂き有難う御座いました。
    DockerFileの設定とDockerの使い方を今一度確認し直します。助かりました!

    キャンセル

  • 2018/03/28 15:23

    Dockerfile作ろうとすると空中戦になるので非常に分かりにくいのが欠点ですね…
    私も`docker exec -it xxx bash`や`docker-compose exec xxx bash`は使いまくってます。

    Dockerの思想は慣れればブレイクスルーが起きると思うので是非頑張って欲しい所ですが、
    結構難解で私も中々勉強が捗りませんでした。
    ゆっくり思想や使い方を覚えていきましょ、また詰まったらteratailに投稿してみてくださいね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる