nvmでNode.jsをインストールしたDockerイメージの作成

# はじめに
Alpine Linuxにnvmをインストールしたイメージをベースイメージにして任意のバージョンのNode.jsをインストールしたDockerイメージを作成します。
今回の作業環境と作成するDockerイメージの内容は以下になります。

#### 作業環境
* Windows10 pro
* Docker for Windows

#### 作成するDockerイメージの内容
* Alpine Linux
* nvm : v0.33.11
* Node.js : v6.11.5

# Node.jsのインストール

nvmをインストールしたイメージからコンテナを起動して、使用したいバージョンのNode.jsをインストールする手順を確認していきます。

```powershell
PS C:\works\docker\alpine-nvm-node> docker run --rm -it alpine-nvm bash
bash-4.4#
```

`v6.11.5`をインストールしたいので以下のよう打ち込みましょう。

```bash
bash-4.4# nvm install 6.11.5
```

正常にインストールできたかと思いますが、結果を見てみると何やらエラーが・・・

```console
env: can't execute 'node': No such file or directory
nvm is not compatible with the npm config "prefix" option: currently set to ""
Run `nvm use --delete-prefix v6.11.5` to unset it.
```

Node.jsのバージョンを見ようとしても「そんなんねぇよ！」って言われてしまいます・・・

```bash
bash-4.4# node -v
bash: /root/.nvm/versions/node/v6.11.5/bin/node: No such file or directory
```

[公式ドキュメントのインストール手順](https://github.com/creationix/nvm#installing-nvm-on-alpine-linux)をよくよく読んでみると、ソースコードからコンパイルしなくてはいけないと書いてありました。
なので、いったん`v6.11.5`を削除して、ソースコードからコンパイルしなおすことにします。
ソースコードからコンパイルするには`install`に`-s`オプションをつければいいようです。

```bash
bash-4.4# nvm uninstall 6.11.5
Uninstalled node v6.11.5
bash-4.4# nvm install -s 6.11.5
```

結構時間がかかるので放置して他のことをしてましょう。

インストールが終わったらNode.jsのバージョンを確認してみましょう。

```bash
bash-4.4# node -v
v6.11.5
```

成功ですね！

## Dockerfileの作成
では上記の手順をもとにDockerfileを作成していきましょう。
nvmをインストールしたイメージとは別のイメージにしたいので、新しいディレクトリで新規でDockerfileを作成します。

```dockerfile:Dockerfile
FROM alpine-nvm
RUN \
    nvm install -s 6.11.5
```

こんな感じですね。
[こちら]()で作成したイメージをベースイメージにしています。
早速ビルドしてみましょう。

```powershell
PS C:\works\docker\alpine-nvm-node> docker build -t alpine-nvm-node:v6.11.5 .
```

途中で`/bin/sh: nvm: not found`と出て止まったかと思います。
Dockerfileからイメージを作成する場合、デフォルトのシェルで動作するので、nvmが動く`bash`で動くようにしてあげないといけなかったようです。
いろいろ調べた結果、以下のようにDockerfileを変更します。

```dockerfile:Dockerfile
FROM alpine-nvm
SHELL ["/bin/bash", "-c"]
RUN \
    source ~/.bashrc && \
    nvm install -s 6.11.5 && \
    nvm cache clear
```

動作するシェルを指定しただけでは`.bashrc`を読み込んでくれないようなので、手順の中に組み込みます。
また、ソースからビルドするのでnvmのキャッシュディレクトリの容量が大きくなっています。
ついでにそれも削除するようにしておきます。
これでビルドを実行するとイメージが作成されるはずです。
作成されたイメージを確認してみましょう。

```powershell
PS C:\works\docker\alpine-nvm-node> docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
alpine-nvm-node            v6.11.1             6ba8a1f65a76        10 minutes ago      252MB
alpine-nvm                 latest              a2f9534c5a8e        3 hours ago         208MB
```

イメージからコンテナを起動してNode.jsがインストールされているのを確認します。

```powershell
PS C:\works\docker\alpine-nvm-node> docker run --rm -it alpine-nvm-node:v6.11.1 bash
bash-4.4# node -v
v6.11.5
```

成功です！

これでいろいろなバージョンのNode.jsの環境をDockerで用意することができるようになりました！

---
ちなみにNode.js公式のDockerイメージは、各バージョンがすでにDockerHubにあります。
https://hub.docker.com/_/node/
Alpine Linuxがベースのイメージもあります！

今回nvmをインストールして、Node.jsの複数バージョンをインストールできるようにしたのは、複数バージョンのNode.jsが必要になったからです。
その必要になった理由は別記事で説明します！

## 参考にしたサイト
[Installing nvm on Alpine Linux](https://github.com/creationix/nvm#installing-nvm-on-alpine-linux)
[Dockerfileでビルド時にbashを使う](https://qiita.com/anagura0000/items/bef08bf129f1bd8529ce)