概要
Lima 上で Docker 環境を構築したときに、いくつかのエラーに遭遇したので、概要と解決策をまとめていく。
環境
- Apple M2 Pro
- Ventura 13.5.2
- Lima 0.17.2
exec format error
x86_64のイメージを実行した時に遭遇。
Podmanを使っていた時には発生しなかったので、何かのライブラリが不足しているのではという推測のもと、色々調べてみた。
qemuで異なるアーキテクチャのコンテナを実行するには qemu-user-static
が必要らしいとわかった。
# in lima instance
sudo apt install qemu-user-static
Can't create TCP/IP socket
インスタンス内でアプリケーションコードをマウントして bundle install
をしていた時に遭遇した。同じ事象の issue が下記。
Lima get stuck when certain frequency of DNS resolution occurs #1285
すでに修正がマージされたバージョンを使っていたから、原因は別にあるのではと思いつつ、このワークアラウンドで回避できる。
hostResolver: enabled: false
g++: fatal error: Killed signal terminated program cc1plus
結論から言うと、当初の Lima インスタンスへのメモリ割り当てが4GBで、gRPC gem のインストール時にメモリが枯渇していた。
2~3GBぐらい喰っていたみたい。単純に倍量を割り当てて解決した。
memory: "8GiB"
read only filesystem
ホームディレクトリはデフォルトで read only だった。単純に設定を変更すれば解決できる。
mounts: - location: "~" writable: true
番外編:ログイン時にバックグラウンドで起動する
ログインのたびに limactl start foo
するのが面倒だったので、デーモン化したかった。
macOS なので launchd を使って実現できた。
今回はログインユーザーへの対応のみで十分だったので、~/LaunchAgents
配下に plist を作成。
vim ~/Library/LaunchAgents/lima.docker.plist
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>lima.docker</string> <key>EnvironmentVariables</key> <dict> <key>PATH</key> <string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string> </dict> <key>ProgramArguments</key> <array> <string>/opt/homebrew/bin/limactl</string> <string>start</string> <string>docker</string> </array> <key>inetdCompatibility</key> <dict> <key>Wait</key> <false/> </dict> <key>RunAtLoad</key> <true/> </dict> </plist>
検証のために手動で反映する。
plistファイルにStandardOutPath
とStandardErrorPath
も指定できて、デバッグするときは追記する。
launchctl load ~/Library/LaunchAgents/lima.docker.plist
その他のプロパティについて、
inetdCompatibility
: man ページを読むに、新しいプロジェクトでは非推奨らしいけど、これがないとプロセスが終了してしまう。RunAtLoad
: これも非推奨だけど、この設定なしではログイン時に起動されなかった。PATH
: いくつか減らしても動くかもしれない。
以上。