環境
- 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使ったほうが良い