Docker Desktop for Apple siliconでRedashを動作させてみた

M1環境に移行する際、一番の壁となっていたRedash Dockerイメージの起動がとりあえずできたので書いてみました。
2021.11.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Docker Desktop for Apple siliconにてIntel環境で動かしていたイメージを起動させようとすると正常に動作しないことがあります。Rosetta2にてカバー不可能なamd64ビルドのライブラリがあるかもしれません。

Redashが動作しない状態に陥り、依存状態を辿ってみた結果M1版がリリースされていないライブラリが原因だと分かりました。とりあえず動くようにしてみました。

watchmedoのコメントアウト

worker及びschedulerを起動した際のメッセージにて、インストールされないことが発覚。

Starting dev RQ orker...

/app/bin/docker-entrypoint: line 28: exec: watchmedo: not found

該当行を見てみます。

% sed -n 28p bin/docker-entrypoint
exec watchmedo auto-restart --directory=./redash/ --pattern=*.py --recursive -- ./manage.py rq worker $QUEUES

We've spent a lot of time working on this and the problem is that emulation on M1 does not support inotify .

対処が悩ましいところですが、redash本体に直修正はほぼ入れないためwatchmedoを外す方向で進めます。

dev_worker() {
  echo "Starting dev RQ worker..."

  export WORKERS_COUNT=${WORKERS_COUNT:-2}
  export QUEUES=${QUEUES:-}

  exec supervisord -c worker.conf

#  exec watchmedo auto-restart --directory=./redash/ --pattern=*.py --recursive -- ./manage.py rq worker $QUEUES
}

worker() 側の処理をそのまま持ってくることで対処しました。schedulerについても同様の対処をいれておきます。

dev_scheduler() {
  echo "Starting dev RQ scheduler..."

  exec /app/manage.py rq scheduler
  #exec watchmedo auto-restart --directory=./redash/ --pattern=*.py --recursive -- ./manage.py rq scheduler
}

client/distのビルド

これはM1そのものは直接関係しないかもしれません。

cloneしたあとにdocker-composeを走らせた結果、client/distが存在していないためにエラーとなるケースの対処です。

git clone git@github.com:getredash/redash.git
cd redash/
# edit source
npm run build
docker-compose run --rm server create_db
docker-compose up -d

docker-entrypointへの修正は # edit source にて行ってください。

/bin/sh: tsc: command not found となる場合は

npm install typescript -g

Cannot find type definition file for 'jest' となる場合は

yarn add --dev jest

とそれぞれ実行します。

あとがき

watchmedoについてはイメージに --platform=linux/amd64 と指定を入れる事も考えましたが、エラーメッセージが

OSError: [Errno 38] Function not implemented

に変わるだけだったので諦めました。

利用するイメージを linux/arm64 から linux/amd64 に切り替えることで動作することもあれば対処不能な場合もあります。リポジトリのIssueにて対応が進んでいる可能性もあるので、困った場合はライブラリ公式リポジトリのIssueを確認してみましょう。