M1でもDockerで開発したい!
追記
M1 Mac Technical Previewがリリースされ、私のM1Macにも来ました。(Docker Desktopなので)QEMUによると思われるx86_64エミュレーションもあり、全てが普通に動きます。正直悔しい この記事の賞味期限さすがに短すぎるだろ
https://gyazo.com/ff9a83c99677f2aab88918271e41450f
非常に高性能かつ低消費電力でラップトップとして理想的な性能を持つM1Mac、技術オタクとしてはぜひ年末年始の間にがっつり使いこんでみたいところです。しかし、開発用途で使うにはツールチェインの不足が否めません。例を挙げると v15以降をビルドする必要がある(~v14はlibicu関連でコケる)
Docker for Macの仕組み
備考(オタク特有の早口)
ここで「macOSもLinuxも*nixなんだからだいたい同じように動くんじゃないか」と思うかもしれませんが、macOSとLinuxのシステムコールは異なっているので(たしかバイナリの形式も違う)同じようには動きません。 そこでDocker for MacはVMの上でLinuxを動かし、そこにmacOSのファイルシステムを必要に応じてボリュームとしてマウントし、コンテナを動かすことでDockerを動かしています。つまりこれを再現すれば… 戦略
UTMはHypervisor.frameworkを利用するためのパッチが当たったQEMUを使っています。QEMU最高! UTMのポートフォワーディングを利用してSSHを通したり、アプリにアクセスします。OSはUbuntuあたりを入れておけば大丈夫でしょう。arm64に対応したLinuxディストリの選択肢はそこまで多くない気もしますが。 実践
ここではSSHのポートを2222:22(Host:Guest)としたことにして、DockerやSSHの設定は既に済んでいるものとします。 面倒臭いので
まずmutagenを起動します。クローンしたディレクトリで
$ mutagen sync create --name portal . <ユーザー名>@localhost:2222:~/portal
などとして同期を開始します。この同期セッションは一度sshが切れても持続するので何度も作る必要はありません(むしろ作りすぎてVMを不安定にしてしまった)。
$ ssh -p 2222 localhost
などとして~/portalに移動した後
$ sudo docker-compose up
すると…おめでとうございます、動きません!
linux/arm64対応
先ほどはdocker pullすら成功しなかったと思われますが、理由は要求しているDocker Imageがarm64に対応していなかったためです。Linuxの世界にはRosettaなんて便利なものはないのでx86_64のコードは動かないのです…… GoもStableで対応していますし
Portalのために行ったことは以下の通りです。面倒なので箇条書きにしてしまいます。
envoy-proxy/envoyをv1.16.1に
nodeを14.15.1に
jwilder/dockerizeを利用するのをやめ、シェル製のvishnubob/wait-for-itに
教えてくれたotofune.iconに感謝
k0kubun/sqldefのarm64版を利用するように
cs3238-tsuzu/dbenvのフォークを作成し、arm64版を利用するように 後でPR出したい
mysql:5.7からmysql/mysql-server:8.0に変更
唯一メジャーバージョンの変化を含む変更であり、非互換を覚悟していたが普通に動いた
非常に大きな落とし穴としてMYSQL_ROOT_HOSTを%にしておかないとhostがlocalhostになってしまい、他のコンテナからアクセスできなくなる
この変更は近々Portal本体に反映したいと思っています。
tosuke.iconがアーキテクチャ違いをDockerfileに反映させる方法を知らないため……
ここまでの変更を加えるとようやくPortalが動きます、めでたい
https://gyazo.com/ff9a83c99677f2aab88918271e41450f
嬉しさのあまり再掲
感想
タイトルに翻訳が含まれてない翻訳記事みたいだ
できるじゃろと思って見切り発車で始めたらできた……
それはそうとして
https://tweet-card.now.sh/1337071798735745030.jpg?lang=ja https://twitter.com/Nebuk89/status/1337071798735745030
マジか……