😕

Docker Alpine Linuxで、nvmを使えるようにする

commits3 min read

以下の解決方法には致命的な問題点があります!詳細は 最後に の節を参照してください 🙏

解決方法

以下のような Dockerfile で、nvmを alpine linux で扱えるようになります。

Dockerfile(alpine)
FROM alpine

# nvmのインストールに必要なモノとnodeのコンパイルに必要なモノをインストール
RUN apk add -U curl bash ca-certificates\
	openssl ncurses coreutils python2\
	make gcc g++ libgcc linux-headers\
	grep util-linux binutils findutils

# shellをbashに変更
SHELL [ "/bin/bash", "-c" ]

# nvmをインストール
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash

# lts版のnodeをインストール
RUN . $HOME/.nvm/nvm.sh && \  # 環境変数を適用
    nvm install -s --lts && \ # nodeをインストール&ビルド
    nvm use --lts && \ # 使用するnodeのバージョンを設定
    node -v && npm -v && \ # バージョンの確認
    npm i -g yarn # yarnも一応インストール

# nvmの初期化するように.bashrcに書き込む
RUN echo -e "\
export NVM_DIR=\"\$HOME/.nvm\"\n\
[ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\"\n\
" >> ~/.bashrc

# bashをデフォルトに設定する
ENTRYPOINT [ "/bin/bash" ]

Ubuntu 版

ubuntu で良いなら、もっと簡単に設定できます。

Dockerfile(ubuntu)
FROM ubuntu:20.10

RUN apt update

# nvmのインストールに必要なモノをインストール
RUN apt install -y curl git

# shellをbashに変更
SHELL [ "/bin/bash", "-c" ]

# nvmをインストール
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash

# lts版のnodeをインストール
RUN . $HOME/.nvm/nvm.sh && \
    nvm install --lts && \
    nvm use --lts && \
    node -v && npm -v && \
    npm i -g yarn

具体的な解説

alpine 版に nvm を普通にインストールして node をインストールしようとすると、エラーが発生してしまいます 😢 alpine 版には必要最低限のモノしか入っていないので当然と言えば当然ですが、公式のリポジトリにその理由が書いてあったので、紹介しておきます。

https://github.com/nvm-sh/nvm#installing-nvm-on-alpine-linux

上記の nvm のリポジトリより引用したものを以下に示します 👇

Alpine Linux, unlike mainstream/traditional Linux distributions, is based on BusyBox, a very compact (~5MB) Linux distribution. BusyBox (and thus Alpine Linux) uses a different C/C++ stack to most mainstream/traditional Linux distributions - musl. This makes binary programs built for such mainstream/traditional incompatible with Alpine Linux, thus we cannot simply nvm install X on Alpine Linux and expect the downloaded binary to run correctly - you'll likely see "...does not exist" errors if you try that.

There is a -s flag for nvm install which requests nvm download Node source and compile it locally.

要約すると、alpine だと node をインストールしてビルドする必要があるよ! ってことです。
そのため、nvm installする時に-sオプションを渡してビルドするようにしなければなりません。

node のビルドは凄く時間が掛かります!私の環境では2125.8s(35 分)かかりました 🤪

Dockerfile の注意点

エラーが発生する例
# 環境変数を適用
RUN . $HOME/.nvm/nvm.sh

# lts版のnodeをインストール
RUN nvm install -s --lts

上記のような感じで、nvm の初期化と node のインストールを別々のRUNで実行すると、

nvm: command not found

と言うエラーが発生してしまうので、注意してください。
正しくは、まとめて実行する必要があります 👇

エラーが発生しない例
# 環境変数を適用し、lts版のnodeをインストール
RUN . $HOME/.nvm/nvm.sh && nvm install -s --lts

最後に

nvm なんて使わずに、node:alpine イメージとかを使った方が良いと思います 😕

結局、ビルド時間が長すぎて使い物になりません 😒
ubuntu 版ならビルドせずに済むので、使ってみてもいいかもしれません。。。

ここまで読んでくれてありがとうございます 🙏
記事に間違いなどがあれば、コメントなどで教えて頂けると嬉しいです。

これが誰かの参考になれば幸いです。
それではまた 👋

GitHubで編集を提案

Discussion

ログインするとコメントできます