こんにちは、おくやんです。
このブログでは、開発に役立つノウハウを実践的なコード例と共に紹介しています。
Docker上でMySQLを起動した際に「mbind: Operation not permitted」が発生するけど、どう対応すればいいかわからない。。。
今回は、このようなお悩みを解決します。
本記事の内容
「mbind: Operation not permitted」が発生する理由
「mbind: Operation not permitted」の対処方法
Docker上でMySQLを起動した際に出力されるエラーに関して調べてみました。
同様の事象に悩んでいる方は本記事を参考にしてみてください。
リンク
発生した事象について
下記内容のdocker-compose.ymlでMySQLを起動した際、ターミナル上に「mbind: Operation not permitted」が出力されました。
docker-compose.yml
version: '3.8'
services:
db:
image: mysql:8.0.33-debian
environment:
- TZ=Asia/Tokyo
volumes:
- db-data:/var/lib/mysql
ports:
- 13306:3306
env_file:
- .env
volumes:
db-data:
driver: local
ターミナル上のエラー
このエラー原因と対処方法についてまとめました。
「mbind: Operation not permitted」が発生する理由
結論から述べるとMySQL側の問題ではなく、コンテナ上のOSの問題となります。
ターミナル上にエラーは出ているものの、DBには正しくデータが保存されます。
エラーの根本原因となっているのがSeccomp (secure computing mode)です。
Seccompとは
SeccompとはLinuxカーネルの機能の1つであり、プロセスに対してシステムコールを制限することができます。
Dockerではこの機能がデフォルトで有効となっており、特定のシステムコールはデフォルトで実行できなくなっています(参照: Seccomp security profiles for Docker)
Seccompによりシステムコールが制限されているため、mbindをコールした際に「mbind: Operation not permitted」が出力されています。
「mbind: Operation not permitted」の対処方法
原因がわかったところで対処方法です。
Seccompにより、デフォルトでは実行できなくなっているmbindを実行できるようにしましょう。
mbindを使用できるようにケイパビリティ「CAP_SYS_NICE」を追加します。
docker-compose.ymlを下記のように修正してください。
docker-compose.yml
services:
db:
・・・
env_file:
- .env
cap_add: # 追加
- SYS_NICE
「CAP_SYS_NICE」を設定することにより、mbindを実行する権限が付与され、「mbind: Operation not permitted」が出ないようになります。
参考
最後まで読んでいただき、ありがとうございます。