タイトルの通りですが結論だけ先に書きます。
localstack のボリュームマウントは /tmp/localstack
ではなく /var/lib/localstack
にしましょう。
詳細
docker-compose を使ってローカル開発をしていたところ、ある日 localstack が立ち上がらなくなりました。
sample-localstack-localstack-1 | ERROR: 'rm -rf "/tmp/localstack"': exit code 1; output: b"rm: cannot remove '/tmp/localstack': Device or resource busy\n"
sample-localstack-localstack-1 | Traceback (most recent call last):
sample-localstack-localstack-1 | File "<frozen runpy>", line 198, in _run_module_as_main
sample-localstack-localstack-1 | File "<frozen runpy>", line 88, in _run_code
sample-localstack-localstack-1 | File "/opt/code/localstack/localstack/runtime/main.py", line 28, in <module>
sample-localstack-localstack-1 | main()
sample-localstack-localstack-1 | File "/opt/code/localstack/localstack/runtime/main.py", line 20, in main
sample-localstack-localstack-1 | infra.start_infra(asynchronous=False)
sample-localstack-localstack-1 | File "/opt/code/localstack/localstack/services/infra.py", line 235, in start_infra
sample-localstack-localstack-1 | files.rm_rf(config.dirs.tmp)
sample-localstack-localstack-1 | File "/opt/code/localstack/localstack/utils/files.py", line 214, in rm_rf
sample-localstack-localstack-1 | shutil.rmtree(path)
sample-localstack-localstack-1 | File "/usr/local/lib/python3.11/shutil.py", line 738, in rmtree
sample-localstack-localstack-1 | onerror(os.rmdir, path, sys.exc_info())
sample-localstack-localstack-1 | File "/usr/local/lib/python3.11/shutil.py", line 736, in rmtree
sample-localstack-localstack-1 | os.rmdir(path, dir_fd=dir_fd)
sample-localstack-localstack-1 | OSError: [Errno 16] Device or resource busy: '/tmp/localstack'
sample-localstack-localstack-1 exited with code 1
コンテナ起動時に上記エラーログが出力されていて、どうやらボリュームマウントに指定している /tmp/localstack
の削除に失敗しているようでした。
ボリュームマウントを削除しようとしている理由を調べていたところこのリリースノートがにたどり着きました。
github.com
v1 系のリリースでディレクトリ構成が変更され /tmp/localstack
のボリュームマウントは非推奨になり、/var/lib/localstack
に移行して下さいとのことです。
LEGACY_DIRECTRIES=1 にすることで旧バージョンを利用することができたようです。
私は LEGAY_DIRECTORIES が廃止される v2 を利用していましたが起動はできていました。
しかし、ボリュームマウントは機能してなかったようです。
(SQS しか使っていなかったので永続化させる必要がなく気付いていませんでした...)
localstack の image バージョン は latest を指定しており、今回たまたまローカルの docker image を削除して build したタイミングで v3 系を pull し発生するようになったようです。
ちなみにドキュメントにも記載されています。
docs.localstack.cloud
ちゃんとドキュメントやリリースノートを読んで利用しないと調べるのにも時間がかかるしハマってしまいますね。