Docker on M1 macでRails/Nuxt開発環境を試す(だいたい動いた
これでついにM1 MacbookAirを開発機として使えるようになります!多分。
先日、DockerのAppleSilicon対応版がDeveloper Preview Program(要ユーザ登録)で公開されたので早速試してみました。
インストールは特別なことなくD&Dするだけ。まずはターミナルからalpineを起動してみます。
$ docker run -it --rm alpine sh
/ # uname -a
Linux 1bf5d756f216 4.19.104-linuxkit #1 SMP PREEMPT Sat Feb 15 00:49:47
UTC 2020 aarch64 Linux
/ #
あっさり動きました。CPUはaarch64=ARMとして認識してます。
次にInter Macで動いていたRails & Nuxtのプロジェクトをビルドしてみます。
$ docker-compose build
ruby:2.6イメージを元にしたRailsを使うDockerfileは普通にビルドできたんですが、node:12.16.2-alpine3.11をベースにしたNuxt用のDockerfileがyarn install中にnode-sassのインストールプロセス内でpython2がないというエラーで止まりました。
確かにnodeイメージにはPythonが入っていないのですが、今ままでの環境ではエラーになりませんでした。エラーを追ってみるとnode-sassはamd64環境ではコンパイル済みライブラリを使い、それ以外の環境ではコンパイルを行うようでした。なのでDockerfileのパッケージインストールにpython, make, g++を追加したところ無事ビルド終わりました。
RUN apk update && apk upgrade && \
apk add --no-cache bash git openssh python make g++
nodeとrubyは公式イメージがarm64対応してたのであっさり動きました。
さてビルドが一通り終わったので、docker-compose upするとMySQL 5.6がエラーで起動しませんでした。調べてみるとMySQLのarm64対応はMySQL 8からでした。MySQLから派生したMariaDBはarm64対応していたのでdocker-compose.yamlのイメージ指定を`mariadb:10`にしたところ起動しました。
amd64イメージのMySQLを動かす
よく考えてみると、Docker on M1はamd64のエミュレーション機能を持っているので、arm64イメージのないmysql:5.6も動くはずです。しかし現在のTech Preview5ではバグなのか、CPUエミュレーションを使うときはImage IDまで指定する必要があるようです。IDはここから取得できます。
docker-compose.yamlでは下記のように指定します。
mysql:
image: mysql@sha256:d8e4032005f53a774f2361281ebf61fa3d7635d5dacf9c58bc54e823ddcf9f1d
environment:
MYSQL_ROOT_PASSWORD: "secret"
これで、amd64イメージのMySQLが動きました。
イメージによっては指定しないでもamd64で動くものがあるので挙動が謎ですが、そのうち治るでしょう。
半日、このまま使ってみましたが、いまのところ問題なく動いています。この調子だと年明けに出る正式版では多くのWeb系開発者はM1 Macbookで作業ができるようになるんじゃないかと思います。