【Docker】Mac×Dockerで環境構築する時に気をつけること

新しく参入した現場でエンジニアがやる最初の仕事・・そう、開発環境の構築。

この記事では、私が2022年4月の転職を機にWindowからMacユーザとなり、そこでDockerを使って環境構築しようとした時の苦労を振り返りつつ、

  • Mac×Dockerで環境構築するときに気を付けると良いこと

を紹介したいと思います。「Railsが・・」「Reactで・・」というようなプログラミング技術の話ではなく、もう少し「低階層」なレベルでのTipsです。

  • Mac乗り換えを考えているが、環境構築できるか不安だ
  • まさしく今Mac×Dockerでつらみにハマっている

というようなあなたの参考になれば。

この世には2種類のMacがいる

まず前提として、Macユーザにはもう既知も既知でしょうが、この世には2種類のMacがいます。Intel x86_64系Macか、arm64系Macかです。意外と自分のようなWindowsどっぷりマンは知らなかった。

非エンジニアの方向けに補足しておくと、これはコンピュータの中央演算装置(CPU、プロセッサ)の構造による分類です。ここでは細かい説明を省いて(け、決してできないとは言ってない)、それぞれを「Intel系」「Mac系」と呼ぶことにします。

Macを製造するAppleはもともと、このCPUにIntel系を採用・調達していたのですが、満を持して2020年11月、自社で開発したMac系のCPUを搭載するようになりました。

そしてこのCPU構造の違いが、今回私を苦しめる原因になったのです・・

M1 Macでエラーが解消しない・・?

それでは、私がどのように苦しんだか話していこうと思います。

転職初日から、参入プロジェクトに既存であったキャッチアップ資料を参考に、Mac系CPUを搭載したMacbook ProでDockerコンテナを利用して開発環境(ローカルでいくつかサーバが立ち上がる)を作ろうとしました。ちなみにOS Montereyのv12.2.1です。無垢で純真な生まれたてのMacユーザである私は、安直に「ターミナル」を起動し、docker-composeコマンドでイメージをビルド、そしてコンテナ実行、と進めていきました(だってLinuxならこれでうまくいきそうだったんだもん)。これが苦労の始まりとも知らずに。

必要上、立ち上げたコンテナの中で、”yarn install”コマンドを実行する手順があったのですが、そこで「必要なコマンドが見つかりません」というようなエラーに遭遇。しかしそこはエンジニア、この程度のエラーなら慣れています。必要なコマンドが見つからないなら、ちゃんとセットアップしてあげれば良いのです。簡単、簡単。と思いきや、またも同じエラーが発生。およよ?

# 発生したエラーのイメージ
[4/4] Building fresh packages...

    ...
error /app/node_modules/@sentry/cli: Command failed.
Exit code: 1
Command: node xxx...
Arguments: 
Directory: /app/node_modules/@sentry/cli

対策①コンテナ実行するCPU archに気を付ける

ここで私はチームのシニアエンジニアに相談、「この世には2種類のMacがいる」こと、dockerコンテナ実行時には前述したCPUアーキテクチャを考慮する必要があることを知ります。そしてこのCPUアーキテクチャの違いを克服できるのが、「ターミナルを、Rosetta2を使って動かす」という方法でした。詳しい説明はリンク先の記事に譲りますが、この方法で私は、Mac系CPU搭載のMacbookであたかもIntel系CPUが動いているような状況を作ることに成功します。これでいける!

対策②実行したコンテナ内のCPU archにも気を付ける

と思いきや、またしても件のエラーが発生。もうこの先一生、環境構築する羽目になるんじゃなかろうかという不安が頭をよぎります。

ここでまたしてもシニアエンジニアから、デルフォイの神託のごとき一言が。ソクラテス以上の賢者は一人もいな・・間違えた、「実行しているコンテナのCPUアーキテクチャにも気を付ける必要がある」。覚えたてのuname -mコマンドでCPUアーキテクチャを調べてみると・・

$ docker-compose exec -it container-name bash

bash# uname -m
arm64   ←あっ、Intel系じゃない

そう、Rosettaを使って起動したターミナルでも残るエラー、それはコンテナ内のCPUアーキテクチャがMac系だったからでした。Rosetta使用前にDockerイメージをビルドしていたため、dockerイメージがサポートするマルチCPUアーキテクチャの仕様によって、Mac系アーキテクチャでイメージがプルされていたのです。

したがって今回は、docker-compose.ymlで以下のようにIntel系アーキテクチャを明示的にプルしてくるように設定すると・・構築でけました!めでたしめでたし。

services:
    container-name:
        image: node:14.11.0-stretch
        platform: linux/x86_64

まとめ

  • Mac×Dockerで開発環境を構築するときは、CPUアーキテクチャにも気を付ける。Mac側だけでなく、コンテナの中のも。
  • CPUアーキテクチャを調べるにはuname -mコマンドが使える
  • CPUアーキテクチャを明示してDockerイメージをプルできるので、困ったらそれを活用

参考