はじめに
既存プロジェクトの環境構築を行なった際に、コンテナのビルド実行時にコンテナ内のログにエラーが出力されました。解決に時間がかかったため、自分が試した方法をまとめます。
原因
csgroupにはv1とv2が存在しており、Dockerのv20.10以降ではcsgroup v2
がデフォルトで設定されているようです。プロジェクトのDockerイメージは、CentOS 7をベースとした「Amazon Linux2」を使用していましたが、csgroup v2
を使用するコンテナではCentOS 7を動かせないという情報を見つけました。
私の環境では、Docker v27.4.0を使用しており、csgroup v2
であったことから今回のエラーが発生したと考えられます。
Dockerのシステム情報は docker info
コマンドで確認できます。
※下記は自分のPC上で実行した結果であり、今回関連しているシステム情報のみを載せています
Server Version: 27.4.0
Cgroup Version: 2
csgroupは「Controlle Group」の略で、グループ化されたプロセスのリソース(CPUやメモリ等)に対して使用量の監視や制限等を行います。
解決方法① cgroupの設定を変更する
PCの settings-store.json
ファイルを開き、cgroupの設定を書き換えます。
vi ~/Library/Group\ Containers/group.com.docker/settings-store.json
setting-store.jsonファイルの設定に以下を追記し、保存します。
"DeprecatedCgroupv1": true
catコマンドで設定が追記されていることを確認できたらPCを再起動します。
cat ~/Library/Group\ Containers/group.com.docker/settings-store.json
csgroupをv2からv1に変更できたので、期待を込めてビルドしましたがエラーの内容は変わりませんでした。。。
解決方法② コンテナにcgroupをマウントする
上記の方法でエラーが解消しない場合、コンテナにcgroupがマウントされるように設定します。
api:
build: ./api
volumes:
~略~
- /sys/fs/cgroup:/sys/fs/cgroup #追記
ports:
- "8080:80"
cap_add:
- SYS_ADMIN #追記
environment:
- container=docker #追記
cgroupの設定で「:ro (read only)」オプションを付けて実行すると 'read-only file system' エラーが発生するためオプションの設定はしません。
+ /sys/fs/cgroup:/sys/fs/cgroup
- /sys/fs/cgroup:/sys/fs/cgroup:ro
再度ビルドを実行するとログのエラーが解消しました!
まとめ
今回の環境構築では、プロジェクトが想定しているDockerのシステム情報に、自分のDockerの設定を合わせることで解決できました。
プロジェクトで使用しているDockerイメージが古い場合は、エラーが出た際にDockerのバージョンが関係していないかという点にも考慮する必要があるなと思いました。