Docker Alpine Linuxで、nvmを使えるようにする
解決方法
以下のような Dockerfile で、nvmを alpine linux で扱えるようになります。
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 で良いなら、もっと簡単に設定できます。
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 版には必要最低限のモノしか入っていないので当然と言えば当然ですが、公式のリポジトリにその理由が書いてあったので、紹介しておきます。
上記の 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
オプションを渡してビルドするようにしなければなりません。
Dockerfile の注意点
# 環境変数を適用
RUN . $HOME/.nvm/nvm.sh
# lts版のnodeをインストール
RUN nvm install -s --lts
上記のような感じで、nvm の初期化と node のインストールを別々のRUN
で実行すると、
と言うエラーが発生してしまうので、注意してください。
正しくは、まとめて実行する必要があります 👇
# 環境変数を適用し、lts版のnodeをインストール
RUN . $HOME/.nvm/nvm.sh && nvm install -s --lts
最後に
nvm なんて使わずに、node:alpine イメージとかを使った方が良いと思います 😕
結局、ビルド時間が長すぎて使い物になりません 😒
ubuntu 版ならビルドせずに済むので、使ってみてもいいかもしれません。。。
ここまで読んでくれてありがとうございます 🙏
記事に間違いなどがあれば、コメントなどで教えて頂けると嬉しいです。
これが誰かの参考になれば幸いです。
それではまた 👋
Discussion