Dockerでphpコンテナとかにnpmをインストールするときのメモ
はじめに
Dockerでは公式イメージとしてnodeが提供されていて、それを使えばnpmはお手軽にお手元で使えるんですが、Laravelで開発していてphpコンテナとか、node以外のコンテナにnpmを入れたいことがある。
その際に(Docker起因ではないのだが)エラーが出てしまってあまり愚直には導入できなかったりするので、ハマったところなどを簡単にメモしておきます。
いいからはやく教えろ
Dockerfileベースだと、こんな感じでnpmが導入できます(phpイメージに対して導入する想定です)。
FROM php:7.2-apache RUN apt-get -y update RUN apt-get install -y \ curl \ gnupg RUN curl -sL https://deb.nodesource.com/setup_11.x | bash - RUN apt-get install -y nodejs RUN npm install npm@latest -g
じっくり教えろ
npm同梱されてない問題
とりあえずnpmはnodeに同梱されてるはずなのでapt-get install nodejs
すればええやろ、とDockerfileに書いたんですが、
bash: npm: command not found
npmコマンドが見つかりません。なぜだ。
npmインストールできない問題
さらに、別途npmコマンドをインストールしようとしても、
E: Package 'npm' has no installation candidate
となります。
どうやらubuntu公式が提供しているリポジトリのnodejsは勝手が違うらしく、nodeではなくnodejsコマンドで実行され、しかもnpmが同梱されていない様子…。このへんの詳細はあまり言及している記事がないので、「おそらくたぶんそう」ぐらいのアレです。
これを解決するためにはubuntuの提供するnodejsを使わないようにしてやります。具体的にはNodeSourceが提供するバイナリディストリビューションをインストールします。
> # Using Debian, as root > curl -sL https://deb.nodesource.com/setup_11.x | bash - > apt-get install -y nodejs
インストールしたいnodeのバージョンに合わせて上記のコマンドを実行しましょう。先般のnodejsが残っている場合は先にアンインストールしておいてください。
E: gnupg, gnupg2 and gnupg1 do not seem to be installed, but one of them is required for this operation (23) Failed writing body
なお、curlを使用したインストールのタイミングで上記のようなエラーが出る場合があるので、その際は事前に
apt-get install gnupg
をしておくようにしましょう。
npmを最新にしておく
root@dc304b06a4f3:/var/www/html# npm --version 6.7.0
また、この時点ではnpmが最新ではない場合があるので、
npm install npm@latest -g
を実行し、npmを最新にしておくようにします。
これで、phpコンテナにnodeとnpmがインストールされましたね。おわりです。
おわりに
Dockerのイメージが乗っかってるubuntuのバージョンが古くて云々…みたいな話にはたまに引っかかります。