見出し画像

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で作業ができるようになるんじゃないかと思います。