docker sqlserver is fuck

Docker SQLServer

M1 MacBookでSQL Server(docker)を動作させるのは相性が良くない

2022年10月28日

後述:OSのバージョンがventuraになった事と、Docker Desktopのバージョンがv4.16以降で動作に仮対応した様です。

Rosetta 2をダウンロードし、Docker Dashboardから「Use Rosetta for x86/amd64 emulation on Apple Silicon」のチェックをオンに変更すれば動作自体は可能です。参考:Microsoft Developer Blogs

ひょんなことからSQL Serverの検証をしなければいけなくなり、dockerで動くか確認していたのですが、どうやらM1チップ内蔵のMacBookと相性が良くなさそうなのでメモを残しておきます。

「M1 MacBook SQL Serverを動かす」みたいな検索ワードでファストビューに出てくる日本語のサイトが、軒並みHello worldレベルの動作想定なので、業務運用だとミスリード記事になってしまいます。GUIツールであるAzure Data StudioもManagement Studioに比べて著しく機能が無いため併せて注意が必要です。

海外サイトで検索するとこういった記事は出てません。むしろGithubなどで、Microsoftはちゃんとサポートして!という内容のコメントが投稿されています。

https://github.com/microsoft/mssql-docker/issues/734

後述:この記事を書いた数日後に上記のissuesでlimaを使用した方法が紹介されています。

仮想環境の上のコンテナを作成するのであればMacを使う意味がないので本末転倒な気がしますが、苦肉の策でも動かしたい場合はこれしか無さそうです。

ただし仮想環境を多重に動かしている状態なので動作は想像しているより重くなり、かつPCに相応の負担をかけるため個人的にはおすすめしません。

https://github.com/microsoft/mssql-docker/issues/734#issuecomment-1333696500

注意

GitHub上でのやり取りでも書かれているので引用翻訳しておきます。

Rosettaでx86_64のSQL Serverコンテナを実行することは、理想的な解決策ではないことが確認できました。アーキエミュレーションのため、負荷がかかるとSQL Serverコンテナがロックされ、応答しなくなるのです。M1を使っている開発者は、SQL Serverコンテナを常に再起動しなければならないことを報告しています。使用は可能ですが、バグが多いのです。

引用元:https://github.com/microsoft/mssql-docker/issues/734#issuecomment-1385603928

docker SQL Server利用について

一般的にdockerでSQL Serverを利用する場合下記を利用することになると思います。

image: mcr.microsoft.com/mssql/server:YYYY-latest

上記のimageはM1(arm64)では起動すらしないため下記が推奨されますが、azure-sql-edgeは既存imageの代替え品ではありません。コマンドラインツールであるsqlcmdすら存在しないのは、何を想定して作成しているのか不明でした。

sqlcmdについては上記のGithubのコメントに記載されている通り、別imageを作成してそれをバインドしサーバーの指定をhost.docker.internalにする事で対応できます。

image: mcr.microsoft.com/azure-sql-edge

厄介なのは、azure-sql-edgeがサポートしていない機能があまりにも多過ぎるという事です。サイトが巧妙ですが、サポートされる機能のページ内にサポートされていない機能がふんだんに記載されています(笑)。

DB設計周りの動的管理ビューやDBエンジンのCLRに依存する機能などは、業務システムだと無意識に使っているのではないでしょうか。自分はこの辺を使っているシステムを見ていたので、azure-sql-edgeでの運用は不可能と判断せざるをえませんでした。

Azure SQL Edge でサポートされる機能

全体的にMS系は情報が少なく、かつ国内のサイトだと軽度の内容でも出来ることになってしまう記事が乱立しているので注意して下さい。

  • この記事を書いた人

朝倉卍丸

シングルモルトスコッチなどのお土産を持ってきた人を助けるのが好きです。サービスの分割が重要ですが、まあ昔ながらの方法でやりたいこともありますよね。

よく読まれている記事

条件の0=0は全てが正であるを意味するSQL 1

SQLの条件に0=0のような記述を見かけます。 変わった書き方の条件ですが、これは「全てが正である」事を意味しており、結合条件の場合はCROSS JOINと同じです。 下記の例で言えば、結合するsub ...

DISTINCTを使わないで重複排除を考えるSQL 2

SQLのDISTINCTはEXISTSとかGROUP BYでなんとかする事もできます。 DISTINCTは暗黙的なソートがされますが、何のDBを使うにせよ過去のバージョンならともかく、最近のバージョン ...

RFC 5322に準拠させた正規表現言語別 3

RFC5322で定義されている正規表現を、各言語の正規表現に変化させた形になります。 完全な電子メール正規表現は存在しないので、結局のところ何かの公式基準に従っていたとしても、自分が携わるサービスのル ...

-Docker, SQLServer