Docker Composeを使ってgolangのtest実行していたら、Operation not permittedというエラーに遭遇した。
Docker Documentation - runtaime-privilege-and-linux-capabilities
Dockerコンテナの特権設定をいじると解決する。
gobel_test_db:
container_name: "gobel_test_db"
build: ./docker/mysql
ports:
- "3305:3306"
volumes:
- mysql_gobel_test_db:/var/lib/mysql:delegated
- ./docker/mysql/initdb.d/gobel_test_db:/docker-entrypoint-initdb.d
environment:
- MYSQL_DATABASE=gobel_test
- MYSQL_ROOT_PASSWORD=password
privileged: true // add a this option
上記だとセキュリティ的にどうなのかイマイチよくわかっていないので、もう少し権限を絞るような設定にした。
gobel_test_db:
container_name: "gobel_test_db"
build: ./docker/mysql
ports:
- "3305:3306"
volumes:
- mysql_gobel_test_db:/var/lib/mysql:delegated
- ./docker/mysql/initdb.d/gobel_test_db:/docker-entrypoint-initdb.d
environment:
- MYSQL_DATABASE=gobel_test
- MYSQL_ROOT_PASSWORD=password
cap_add:
- SYS_ADMIN
security_opt:
- seccomp:unconfined
cap_add
はLinux capabilitiesを追加するオプションで、ここではsystem administration operationsの権限を追加している。
Linux capabilitiesはスーパーユーザーの権限を細分化する機能。
seccomp
はLinuxカーネルのシステムコール発行の制限をするセキュリティ関連の機能。
ここでは、unconfined、無効化の設定をしている。
unconfinedは直訳すると"監禁されていない"という意味らしい。
コンテナことは前にちらっと勉強したが、まだまだ理解が浅い。