tsyama記

プログラミングとそのほか

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のバージョンが古くて云々…みたいな話にはたまに引っかかります。

参考記事

qiita.com

stackoverflow.com

github.com