😇

M1 ProのDockerで沼にハマった話

2 min read

環境構築の話はこちらから

https://zenn.dev/kenkenlysh/articles/c84ec0110a71e6

背景

開発環境構築が終わり、業務で使用しているDocker for MacでRailsアプリのコンテナ起動完了するまでに、土日2日間かかってしまった経験を共有したいと思います。
開発環境バージョン
Ruby: 2.7.2
Rails: 6.0
Postgesql: 10.5

Docker for Macをインストール

インテル版でDocker for Mac version:4.2.0を使用していましたが、たまにソースコードの差分を検知できないことがあるため、今回はバージョン4.1.1(M1用)をインストールします。

https://docs.docker.com/desktop/mac/release-notes/

Docker for Macの禁じ手

下の設定画面でCPU数を9以上にすると、docker engineがstoppedとstartingを無限ループしてしまいます。再起動しても、無限ループ終わりません。
もし、こうなったら一度Docker for Macをアンインストールして、再度インストールするしかないです。
docker config

参考URL

https://github.com/docker/for-mac/issues/6063

いざ、Docker for Macの沼へ

準備

  1. docker-composeの編集
    docker-composeには起動させるイメージを指定していると思います。

ホストOSはcircleci/ruby:2.7.2-buster-node-browsersを使用しているため、他のイメージのプラットフォームをplatform: linux/x86_64で指定する必要があります。

db:
  image: postgres:10.5-alpine
  platform: linux/x86_64 # ←ここ

複数のplatformが用意されている

https://hub.docker.com/_/postgres?tab=tags&page=1&name=10.5-alpine
  1. config/environments/development.rbの編集
    元々、ActiveSupport::EventedFileUpdateCheckerになっている。
    rails db:migrateを実行時、このエラー出る。
    Function not implemented - Failed to initialize inotify (Errno::ENOSYS)
    そこでconfig/environments/development.rbを編集した。
config/environments/development.rb
config.file_watcher = ActiveSupport::FileUpdateChecker

参考URL

https://github.com/evilmartians/terraforming-rails/issues/34

ビルド編

dockerfileがあるディレクトリで

docker-compose build
docker-compose run --rm web bin/setup

初回起動時、Javascriptのコンパイルが上手くいかない場合、
rails webpacker:installを実行すると上手くいくこともある

M1 Chipならintel版より高速に動作すると思いきや、コンテナ起動速度はあまり変わらないかも。。。
全てのコンテナをARM版へ移行できれば、起動速度は速くなるかもしれません。
また、Docker for Macから他のツールへ移行するのもいいかもしれません。
今、移行候補としているのはlimaです。

https://github.com/lima-vm/lima

Discussion

ログインするとコメントできます