M1やM2チップ搭載のMacを使う人とそうでないPCを使う人が共同で同じDockerイメージを使って開発をする場合、
ホストマシン間の命令セットアーキテクチャーの違いでDockerコンテナが作成できなかったりする問題が発生することがあります。
例えば、Macに搭載されているApple SiliconがARM64アーキテクチャーで動いている一方で、
それ以外のPCでAMDやIntel製のx86_64アーキテクチャーのプロセッサー (RyzenやIntel Coreシリーズ) を使用している状況です。
それ以外のPCでAMDやIntel製のx86_64アーキテクチャーのプロセッサー (RyzenやIntel Coreシリーズ) を使用している状況です。
Docker Hubから配布されているイメージで両方のアーキテクチャーをサポートしているものを
そのまま利用してる場合などではこのような問題は起きないでしょう。
そのまま利用してる場合などではこのような問題は起きないでしょう。
しかし例えば以下のDockerfileのようにRemiのPHPを利用している場合は、x86_64アーキテクチャーのホストではうまく動作しますが、ARM64アーキテクチャーのマシンでは以下のようなエラーで止まってしまいます。
1 2 3 4 5 |
FROM centos:7.9.2009 RUN yum update -y RUN yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm RUN yum install -y --disablerepo=\* --enablerepo=remi-php74,remi,remi-safe php php-mysqlnd php-devel php-gd php-mbstring php-pdo php-xml php-zip php-pecl-xdebug |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
... https://mirror.docker.ru/remi/enterprise/7/php74/aarch64/repodata/repomd.xml: [Errno 14] HTTPS Error 404 - Not Found Trying other mirror. http://remirepo.reloumirrors.net/enterprise/7/php74/aarch64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found Trying other mirror. https://mirror.dk.team.blue/remi/enterprise/7/php74/aarch64/repodata/repomd.xml: [Errno 14] HTTPS Error 404 - Not Found Trying other mirror. http://ftp.arnes.si/mirrors/remi/enterprise/7/php74/aarch64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found Trying other mirror. https://mirror.netsite.dk/remi/enterprise/7/php74/aarch64/repodata/repomd.xml: [Errno 14] HTTPS Error 404 - Not Found Trying other mirror. ... |
また、ARM64はサポートしていないイメージ (mysql:5.7.42) をどうしても使いたい場合があるかもしれません。
これらのような問題に対するひとつの解決策は、
Apple SiliconのMacでRosetta 2を使いx86_64アーキテクチャーのイメージを動かすことです。
Rosetta 2とは、AppleがApple Siliconのために開発したx86_64命令からARM64命令への変換器です。
デフォルトではインストールされていいませんが、
以下コマンドを実行することで手動でインストールできます。
以下コマンドを実行することで手動でインストールできます。
1 |
/usr/sbin/softwareupdate --install-rosetta --agree-to-license |
次にRosettaをDockerで使えるようにするため、以下のように設定をします (画面はDocker Desktop for Macです) 。
Docker Desktopの設定で、
「Features in development」-> 「Use Rosetta for x86/amd64 exmulation on Apple Silicon」
にチェックを入れて「Apply & restart」をクリックしてください。
そしてDockerで指定のアーキテクチャーで動作させるため、
docker-compse.ymlでは”platform: linux/amd64″をARM64で動かしたいサービスに追加します。
docker-compse.ymlでは”platform: linux/amd64″をARM64で動かしたいサービスに追加します。
コマンドではオプションで–platform linux/arm64を指定します。