久しぶりにフロントエンドの開発をすることになり、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
, andyarn.
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の差異はなくなりつつあります。 どちらも優れたツールであることは間違いないため、公式イメージで両方使える選択肢があるのは嬉しいです。
今後も活用していきたいと思います。