このすみ技術ろぐ

とあるWebエンジニアが、技術や趣味について書くブログです。

nodeの公式イメージはyarnも標準で使えるらしい

久しぶりにフロントエンドの開発をすることになり、node周りの整備をしています。 私は個人的にnpmよりyarnのほうが気に入っているのですが、今までは普通にyarnを追加インストールしていました。

npm install --global yarn
https://classic.yarnpkg.com/en/docs/install/

これでも特段の不便はなかったのですが、つい先日nodeの公式イメージの説明を見たところ、yarnは標準で使えることを知りました。

The node images come in many flavors, each designed for a specific use case. All of the images contain pre-installed versions of node, npm, and yarn. For each supported architecture, the supported variants are different. In the file: versions.json, it lists all supported variants for all of the architectures that we support now.
https://github.com/nodejs/docker-node より

もしかしたら私が過去に失念していただけかもしれませんが、yarnがすぐに使えるのは嬉しいです。 本当にインストールされているのか、確認してみました。

yarnがインストールされているのか確認してみる

実際に試してたところ、確かに標準でインストールされております。

$ docker run --rm node:16.2.0-alpine yarn -v
1.22.5

このように標準でインストールされているため、逆に追加でインストールしようとすると、npm ERR! EEXIST: file already exists エラーになります。

$ docker run --rm node:16.2.0-alpine npm install --global yarn
npm notice
npm notice New minor version of npm available! 7.13.0 -> 7.15.0
npm notice Changelog: <https://github.com/npm/cli/releases/tag/v7.15.0>
npm notice Run `npm install -g npm@7.15.0` to update!
npm notice
npm ERR! code EEXIST
npm ERR! path /usr/local/bin/yarn
npm ERR! EEXIST: file already exists
npm ERR! File exists: /usr/local/bin/yarn
npm ERR! Remove the existing file and try again, or run npm
npm ERR! with --force to overwrite files recklessly.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2021-05-28T15_23_28_937Z-debug.log

Dockerfileの中身を確認してみる

DockerfileがGit上に公開されているため、中身を見てみます。 ダウンロードしたyarnに対して、/usr/local/bin/yarnがシンボリックリンクとして貼られている様子が確認できます。

余談ですが、RUNの数を減らすためなのでしょうが、&&の数珠つなぎがすごい。

https://github.com/nodejs/docker-node/blob/main/16/alpine3.13/Dockerfile

ENV YARN_VERSION 1.22.5

RUN apk add --no-cache --virtual .build-deps-yarn curl gnupg tar \
  && for key in \
    6A010C5166006599AA17F08146C2130DFD2497F5 \
  ; do \
    gpg --batch --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || \
    gpg --batch --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || \
    gpg --batch --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; \
  done \
  && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" \
  && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz.asc" \
  && gpg --batch --verify yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \
  && mkdir -p /opt \
  && tar -xzf yarn-v$YARN_VERSION.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 yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \
  && apk del .build-deps-yarn \
  # smoke test
  && yarn --version

まとめ

nodeの公式イメージではnpmしか使えないと思いこんでいたため、yarnが標準で使えるのを知ったのは発見でした。

個人的にはyarnのほうが安定性に優れていると感じており、yarn派なのですが、以前ほどnpmとyarnの差異はなくなりつつあります。 どちらも優れたツールであることは間違いないため、公式イメージで両方使える選択肢があるのは嬉しいです。

今後も活用していきたいと思います。