Docker on M1 MacでHasuraを動かす

2 min read読了の目安(約2400字

Docker Desktop の Apple Silicon 対応状況

Docker Desktop for Mac は、2021/04/25に公開された v3.3.1 で Apple Silicon に正式対応しました。

https://matsuand.github.io/docs.docker.jp.onthefly/docker-for-mac/apple-silicon/

しかし実際に動くかどうかは動かそうとしているイメージ次第で、まだまだ対応していないイメージもあります。

Hasura を動かす

こちらに issue が上がっていますが Hasura の公式 Docker イメージはまだ Apple Silicon に対応していません。

https://github.com/hasura/graphql-engine/issues/6337

非公式ですが fedormelexin/graphql-engine-arm64 というイメージが代わりに対応してくれているので、これを使うことで動かすことができます。

docker-compose.yml
-    image: hasura/graphql-engine:v1.3.3.cli-migrations-v2
+    image: fedormelexin/graphql-engine-arm64:v1.3.3.cli-migrations-v2

こちらにタグ一覧があるので、適宜タグを選択しましょう。

https://hub.docker.com/r/fedormelexin/graphql-engine-arm64/tags

PostGIS を動かす (オプション)

Docker 公式イメージの postgres は Apple Silicon でも問題なく動くのですが、現在の開発プロジェクトでは PostGIS 拡張を使っているため postgis/postgis イメージを使っています。

こちらもまだ Apple Silicon に対応しておらず issue が上がっています。

https://github.com/postgis/docker-postgis/issues/216

こちらはスクリプト自体は互換性があり手元でビルドすれば動くそうですので、 /postgis ディレクトリに Dockerfile initdb-postgis.sh update-postgis.sh をコピーしてきてビルドするようにしました。

docker-compose.yml
-    image: postgis/postgis:11-3.0-alpine
+    build: 
+      context: ./postgis

従来の設定との互換性を保つ

docker-compose.yml ファイルを修正してしまうと逆に今まで動いていた環境で動かなくなってしまいます。 Git でコミットしないように気をつけるみたいな運用だと絶対に間違えてコミットしてしまうので、うまく共存する仕組みを考える必要があります。

docker-compose コマンドは -f オプションで設定ファイルを指定できます。デフォルトでは docker-compose.yml ですが、実はもうひとつ docker-compose.override.yml というファイルが存在するとこれで上書きしてくれる仕組みがあります。

https://docs.docker.jp/compose/extends.html

この仕組みをつかって、 docker-compose.arm64.yml というファイルを作り、必要な人だけ docker-compose.override.yml にシンボリックリンクを置くことでこれが適用されるようにしてみました。

.gitignore
+ docker-compose.override.yml
docker-compose.arm64.yml
services:
  postgres:
    build:
      context: ./postgis
  hasura:
    image: fedormelexin/graphql-engine-arm64:v1.3.3.cli-migrations-v2
ln -s docker-compose.arm64.yml docker-compose.override.yml

この方法であれば毎回 -f オプションを指定するよりシンプルです。

他の方法として Makefile を使えばアーキテクチャ別にコマンドを実行できるか検討しましたが、今回はもともと Makefile は使っていないためこの方法を採用しました。

まとめ

Docker Desktop、 Homebrew などのツールが対応してきていており、 Apple Silicon での開発も問題なくできるようになってきた印象です。
Hasura のようにまだ公式で対応していないイメージでもそのうち必ず対応するでしょうが、今のうちに対応しておくことで開発機の選択肢が増えてよさそうです。

今回 docker-compose.override.yml について初めて知りましたが、知っていると色々と応用が効きそうです。
他にいい方法があれば是非コメントいただきたいです。