docker
vue.js
vue-cli

vue-cli のテンプレートを Docker で動かす時の注意

vue-cli、使ってますか?私はそんなに使ってません…

今回、手っ取り早く Vue.js の環境を構築したかったことと、他のメンバーにも環境を共有したかったので、 Docker の中に vue-cli を使って Vue.js の環境を構築したのですが、1点だけデフォルトの設定のまま使用するとハマる注意点があり、そこにだいぶ時間を奪われてしまったのでメモ。

Docker 起動

docker run -it -p 3001:8080 -v /Users/akagire/dev/vue:/myapp node:10-alpine ash

ポイント

見てのとおりですが...

  1. node:10-alpine
    軽いので。

  2. ポートフォワード
    -p 3001:8080 で、 webpack-dev-server のデフォルトポートの8080を3001にフォワード。

  3. マウント
    -v /Users/akagire/dev/vue:/myapp で、ホストの /Users/akagire/dev/vue を、コンテナの /myapp にマウント。

  4. ash
    alpinebash じゃなくて ash

うまくいけば、node:10-alpine が自動で pull されて、コンテナの中に入ります。

vue-cli インストール

ここからはコンテナの中です。

npm install -g vue-cli

Vue.js のテンプレートを引っ張ってくる

vue-cli は、用意されたテンプレートを元にプロジェクトを作ってくれる便利な機能があるのでこれを使いました。

もちろんこれもコンテナの中。

vue init webpack test

テンプレートから webpack を選び、 test という名前のプロジェクトを作ります。対話形式でいろいろ聞かれますが、基本は全部空エンターか y でOKです。内容見て自分にあった環境を作ってください。
テンプレートは以下から選べます。
https://github.com/vuejs-templates

npm install

対話が終わったら、プロジェクトフォルダーに移動して npm install

サーバー起動

npm run dev で起動。ビルドが始まり、 Your application is running here: http://localhost:8080 と表示されたらビルド終了。
Docker を使っていない場合は、これで http://localhost:8080 にアクセスすれば終了なのですが、今回は Docker でポートフォワードしているので、 http://localhost:3001 にアクセスします。

ですが、これだと繋がりません。

webpack-dev-server の設定を変更

host:0.0.0.0 にしましょう。

config/index.js
...
    // Various Dev Server settings
    // host: 'localhost', // can be overwritten by process.env.HOST // ここをコメントアウト
    host: '0.0.0.0' // これを追加
...

Dockerfile 方式にして EXPOSE 8080 とかも試しましたがこれでした。。。

ちなみに

vue init <template> <project name> は レガシー扱いなので、慣れたら普通に vue create <project name> とか vue ui でプロジェクト作りましょう。vue ui、めっちゃ未来感ありますね。
https://cli.vuejs.org/guide/creating-a-project.html#using-the-gui

あとは、codesandbox もとりあえず動かしたいだけなら爆速で試せて便利なのでおためしあれ。

追記

vue create を使いたい時は npm install -g vue-cli ではなく npm install -g @vue/cli でインストールしてくださいね。これで作った scaffold は Docker の中にインスコしても特に設定せずにホストから localhost:8080 で見れるはずです。
(しかもサーバーが「お前さん多分これコンテナの中でっせ」ってメッセージを出してくる。嬉しい。)

それでは!