Lima の環境構築でハマったこととか

概要

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ファイルにStandardOutPathStandardErrorPathも指定できて、デバッグするときは追記する。

launchctl load ~/Library/LaunchAgents/lima.docker.plist

その他のプロパティについて、

  • inetdCompatibility: man ページを読むに、新しいプロジェクトでは非推奨らしいけど、これがないとプロセスが終了してしまう。
  • RunAtLoad: これも非推奨だけど、この設定なしではログイン時に起動されなかった。
  • PATH: いくつか減らしても動くかもしれない。

以上。