動かざることバグの如し

近づきたいよ 君の理想に

DockerでNodejsとyarnをなるべくシンプルにインストール

環境

  • Docker 18
  • docker-compose 1.23
  • debian

やりたいこと

とあるDockerイメージにNodejsをインストールすることにした。普通ならapt-get install nodejsとパッケージ管理システム経由でインストールするのが定石だが、理由があってイメージサイズを小さくしなければいけなかった。ので、公式サイトからバイナリをダウンロードする形式でインストールする。

公式のNodejs imageのDockerfileを参考にした。(てかほぼパクリ

nodejsのインストール

NODE_VERSIONにインストールしたいバージョンを指定する。

ENV NODE_VERSION 10.15.1

# install nodejs
RUN curl --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" > /tmp/node.tar.xz && \
  tar -xJf /tmp/node.tar.xz -C /usr/local --strip-components=1 && \
  ln -s /usr/local/bin/node /usr/local/bin/nodejs && \
  rm /tmp/node.tar.xz

ポイントは--strip-components=1指定するってところ。あと知らなかったけど--compressedつけたほうがいいっぽい

yarnをインストール

ENV YARN_VERSION 1.13.0

# install yarn
RUN curl -L --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" > /tmp/yarn.tar.gz && \
  tar -xzf /tmp/yarn.tar.gz -C /opt && \
  ln -s /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn && \
  ln -s /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg && \
  rm /tmp/yarn.tar.gz

Docker実行中にyarn installを実行したい場合は以下

ENV NODE_ROOT /app
WORKDIR $NODE_ROOT
RUN mkdir -p $NODE_ROOT
ADD package.json $NODE_ROOT
ADD yarn.lock $NODE_ROOT
RUN yarn install

メリット

  • イメージが小さくなる

デメリット

  • パッケージ経由に比べると若干複雑
  • バージョンは完全指定なのがつらい

単純にyarn installするだけならmulti-stage builds使ったほうが良い