M1 Mac で Docker 環境構築するときにハマったエラーと解決方法

M1 Mac で Docker 環境構築をする機会がありました。

Windows や Intel Mac では動作するけれど M1 Mac では動かないといったことがあり、そのときの対応を備忘録として書いていきます。

MySQL に接続できない

MySQL のバージョンが5.7.12だと以下のエラーが発生して起動できませんでした。

runtime: failed to create new OS thread (have 2 already; errno=22)
fatal error: newosproc

docker-compose.yml の設定を以下に書き換えると、問題なく起動して接続できます。

db:
    image: mysql:8.0.26 # mysql:5.7.12 から 8系に変更
    platform: linux/arm64 # 追記
    ports:
        - 3306:3306
    volumes:
        - ./mysql:/var/lib/mysql

※追記

docker のバージョンを v20.0.14 に上げたところ上記の設定だとうまくいかず、下記の設定に変更して対応しました。

db:
    image: mysql:8.0
    platform: linux/x86_64

rasterio のインストールでエラー

ベースイメージが ubuntu:20.04 の場合、rasterio ライブラリをインストールするときに以下のエラーが発生しました。

WARNING:root:Failed to get options via gdal-config: [Errno 2] No such file or directory: 'gdal-config'E9E6E1

  ERROR: A GDAL API version must be specified. Provide a path to gdal-config using a GDAL_CONFIG environment variable or use a GDAL_VERSION environment variable.

こちらの Issue を参考に、docker-compose.yml でベースイメージを以下に変更してうまくいきました。

FROM osgeo/gdal:ubuntu-full-3.4.0 # ubuntu:20.04 から変更

Cannot find any JVM shared library エラー

snappy-jpy をインストールするときに Cannot find any JVM shared library エラーが発生しました。

こちらもベースイメージが原因で、ubuntu:20.04 に –platform=linux/amd64 を指定することで解決します。

FROM --platform=linux/amd64 ubuntu:20.04

参考・おすすめ記事

Docker の知識が乏しく、エラー対応にかなりの時間を要しました。

解決方法を調べる過程で、Docker の基礎知識をつけるのに参考になった記事をご紹介します。

基礎知識を習得するのにおすすめです。image や dockerfile といった基本概念から設計のベストプラクティスなどが学べます。

M1 Mac と Docker の基本知識、エラーパターンと解決アプローチについてわかりやすく書かれている記事です。問題にぶつかったときの手がかりを見つけるときにおすすめです。

余談

rasterio のインストールエラーは調べてもなかなか解決できず、Windows や Intel Mac では動くとのことだったので、2台目として Windows を買ってしまおうかと思っていました。

手元に Windows がなかったので、 動くか自分で確かめてから買おうとモノカリでレンタルしました。

Windows の Microsoft Edge ブラウザでも rasterio エラーを調べていたら、解決に至った Issue が検索結果の1番目に出てきて、あっさり動いた経緯があります。

Chrome では同じ検索ワードでも上位にこなかったので、ブラウザを変えて調べるのも解決方法の一つかもしれません・・・