同じ Docker コンテナを使っているのに Mac の人だけインストールできないアプリケーションがあった話
TL;DR
現職で Windows ユーザと Mac ユーザが両方いる状況で Docker を使用した開発を行う際、 Docker コンテナを使って環境を揃えたはずなのになぜか Mac の人だけ特定のアプリをインストールできないということがありました。
☔ 事象確認
Volta という Node.js のバージョン管理ツールを Ubuntu のコンテナ内にインストールする場合を見てみます。
まずは私の Windows 環境でインストールした場合です。
root@e1e4ec59f075:/# curl https://get.volta.sh | bash
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 10930 100 10930 0 0 18747 0 --:--:-- --:--:-- --:--:-- 18780
Installing latest version of Volta (1.1.1)
Checking for existing Volta installation
Fetching archive for Linux, version 1.1.1
######################################################################## 100.0%
Creating directory layout
Extracting Volta binaries and launchers
Finished installation. Updating user profile settings.
Updating your Volta directory. This may take a few moments...
success: Setup complete. Open a new terminal to start using Volta!
うまくいきました。
次にチームメンバーの Mac 環境でインストールした場合です。
root@7aadcab7e1a3:/# curl https://get.volta.sh | bash
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 10930 100 10930 0 0 3010 0 0:00:03 0:00:03 --:--:-- 3026
Error: Sorry! Volta currently only provides pre-built binaries for x86_64 architectures.
えー、、せっかく Docker 使ってるのに・・・ わたしの PC がだめなのかな。。。 🥺
💡 解決方法
いえ、そんなことはありません。 エラーメッセージをよく読んでみましょう。
Error: Sorry! Volta currently only provides pre-built binaries for x86_64 architectures.
x86_64 のアーキテクチャを使わなければならないようです。
アーキテクチャを指定するには、普段の docker pull
コマンドを少し変えて以下のようにします。
docker pull --platform linux/arm64 ubuntu:rolling
ということで Mac の人にも x86_64 アーキテクチャのイメージをプルしてもらって再度試した結果・・・
root@e1e4ec59f075:/# curl https://get.volta.sh | bash
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 10930 100 10930 0 0 18747 0 --:--:-- --:--:-- --:--:-- 18780
Installing latest version of Volta (1.1.1)
Checking for existing Volta installation
Fetching archive for Linux, version 1.1.1
######################################################################## 100.0%
Creating directory layout
Extracting Volta binaries and launchers
Finished installation. Updating user profile settings.
Updating your Volta directory. This may take a few moments...
success: Setup complete. Open a new terminal to start using Volta!
おめでとうございます 🎉
🤔 Docker は OS とアーキテクチャに合うイメージを自動で取得する
arch
コマンドで 2 人のアーキテクチャを確認してみると、
Windows の私は
root@e1e4ec59f075:/# arch
x86_64
Mac のメンバーは
root@7aadcab7e1a3:/# arch
aarch64
で異なっていました。 (Mac のアーキテクチャがが全部 aarch64 というわけではないです。)
Docker は OS とアーキテクチャに合うイメージを自動で取得するようになっています。 アーキテクチャがホストとコンテナで異なる場合、パフォーマンスが落ちる可能性があるそうです。
Multi-platform images | Docker Docs
When you run an image with multi-platform support, Docker automatically selects the image that matches your OS and architecture.
実際に x86_64 の PC で arm64 のイメージをプルすると Docker Desktop 上で以下のように表示されます。
まとめ
アーキテクチャを揃えれば、異なるアーキテクチャの PC を使っている人も同じ環境で開発できるのは事実ですが、 PC とコンテナで異なるアーキテクチャの場合はパフォーマンスが低下してしまうというデメリットもあり、一長一短かと思います。
アーキテクチャとパフォーマンスの問題を同時に、そして厳密に解決するなら、みんな同じアーキテクチャの PC を使用した方がいいでしょう・・・