Open3

フロントエンドエンジニア向け M1 MacBook の開発環境

RiaRia

普段使ってるアプリの対応状況 2020/12/03時点

ARM 対応済み

  • iTerm 2
  • Slack
  • Alfred

ARM 未対応 Rosetta 2 で動作

  • Discord
  • Google 日本語入力
  • VS Code
RiaRia

パッケージマネージャ

Homebrew は 2.6.0 で ARM 対応したみたいだけどリポジトリから配布されるバイナリのアーキテクチャが混在しててしばらく使いづらそう。
現状だとソースをダウンロードして手元でコンパイルする MacPorts がアーキテクチャの変更に強くてしばらくはこっちを使っていこうと考えています。

fish

シェルは fish を使ってる。

$ sudo port install fish
~/.config/fish/config.fish
set PATH /opt/local/bin/ /opt/local/sbin $PATH

Node.js

Nodenv でバージョン管理をしている。

$ git clone git://github.com/nodenv/nodenv.git ~/.nodenv
~/.config/fish/config.fish
set PATH /opt/local/bin/ /opt/local/sbin $HOME/.nodenv/bin $PATH
eval (nodenv init - | source)

15.3.0 は ARM でインストールできる。

$ nodenv install 15.3.0

12.x, 14.x もインストールしたいが ARM だとインストール時にエラーが出てしまったので、Rosetta 2 経由で Intel アーキテクチャで実行する。
ターミナル.app を右クリック > 情報を見る > Rosetta を使用して開く にチェックを入れてターミナルを起動する。

$ nodenv install 12.20.0
$ nodenv install 14.15.1

これで 15.3.0 を実行時は ARM アーキテクチャ、12.20.0, 14.15.1 を実行時は x86 アーキテクチャで実行される。

RiaRia

Docker

AppleSilicon 環境で仮想環境がまだ対応されておらず Docker が動作しない。
エンジニアが一番困るのがここだと思う。

現状どうしようもないので別の Intel マシンか、GCE などに環境を建てることになる。

GCE 上に環境構築

無難そうな Ubuntu 20 で GCE に VM インスタンスを作成。
https://docs.docker.com/engine/install/ubuntu/ ここの情報を参考に Docker 環境を構築。

古いバージョンをアンインストール
$ sudo apt-get remove docker docker-engine docker.io containerd runc
Docker をインストール
$ sudo apt-get update

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
Dockerの公式GPGキーを追加
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

指紋9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88の最後の8文字を検索して、指紋付きのキーがあることを確認します 。

$ sudo apt-key fingerprint 0EBFCD88
リポジトリの追加
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
Docker Engine をインストール
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo なしで docker コマンドを使用できるようにする
$ sudo groupadd docker
$ sudo gpasswd -a $USER docker
$ sudo systemctl restart docker

# 1度ログアウトする
$ exit
ポート 8080 で nginx を起動
docker run -p 8080:80 -d nginx

Mac 側の Docker 設定

docker-compose のインストール
$ sudo port install docker-compose
.config/fish/config.fish
# GCE の IP アドレス
set -Ux DOCKER_HOST ssh://123.123.123.123

これで docker と docker-compose のコマンドが GCE に向くようになりました。

Mac のリバースプロキシ

例えば docker で Redis を使う場合、上記の DOCKER_HOST を変更することで操作できるようになったとしても 123.123.123.123:6379 に接続する必要があります。
このままだとアプリケーション内に localhost:6379 と記述されている箇所に変更が必要で不便なので、localhost:6379 を 123.123.123.123:6379 に TCP のリバースプロキシする設定をしていきます。

nginx のインストール
sudo port install nginx

nginx でリバースプロキシの設定をしていきます。
redis と記述してる2箇所は名前なのでこの2つが紐付けられれば適当な名前で構いません。

/opt/local/etc/nginx/nginx.conf
stream {
    upstream redis {
        server 123.123.123.123:6379;
    }
    server {
        listen 0.0.0.0:6379;
        proxy_pass redis;
    }
}
nginx の再起動
sudo nginx -s reload

これで localhost:6379 のアクセスした際に 123.123.123.123:6379 にリバースプロキシされるようになりました。
少し設定は面倒ですが、以上が別マシンに Docker を建てて開発する手順の紹介でした。

M1 Mac の Docker 対応状況

リリースはされていないが開発チーム内では Docker が動くようになった模様。

Docker が動作するようになってもアーキテクチャが ARM なのは変わらないので、x86 向けのビルドしか公開されてないコンテナイメージは動作しません。
メジャーどころなコンテナイメージはマルチステージビルドされてる印象なのでそれほど問題ないかもしれないですが不安が残ります。