FITSブログ

Docker で環境構築するときの注意点まとめ

 FITS では一部の組み込みプロジェクトを除けば、システム開発における環境構築はほぼ Docker で行っています。今回は Docker で環境構築する際に起こりがちな問題(一部ですが)についての回避策メモをまとめました。

[ERROR] Fatal error: Can’t open and lock privilege tables: Table ‘mysql.user’ doesn’t exist

 mysql の user テーブルを参照しようとして権限テーブルが参照できずエラーとなっています。この問題は意外と根が深くて、DBコンテナとWindows 間でのファイル共有の問題で発生します。

 回避策として、mysqlのデータファイルを格納する volumes の指定先を、ファイルではなくて volumeファイルによる格納に変更する、というものがあります。ただし、この回避策についても、dockerのmariadbのgithubで長い間議論がなされています。

https://github.com/docker-library/mariadb/issues/38

https://github.com/docker-library/mariadb/issues/152

 また、DB のデータを docker の volume で管理してしまうと、コンテナとのライフサイクルとの違いで無駄な工数が発生しがちです。過去にメンバーから出た、DBに古いデータが残っている、更新されない系の問題大抵がvolumeにDBデータを退避せたことによるものでした。これらの理由から、下記のように対応することが多いです。

https://github.com/docker-library/mariadb/issues/38#issuecomment-478346907

 このオプションで O_DIRECT を抑止しているのだと思いますが、なぜOSのDIRECT I/O 機能を使わないことで問題が回避されるかまでは深く追えていません。

Warning: World-writable config file ‘/etc/mysql/conf.d/my.cnf’ is ignored

 これも Windows で DB コンテナを用意しようとして出くわすことがありますね。これについては my.cnf などのMySQL用の設定ファイルをWindowsで作成してそのままコンテナと共有した場合に起きます。回避策としては色々とありますが、 docker exec -it xxx bash または VSCode で RemoteのContainerにAttachし、コンテナ側でファイルモードを変更するのが早いです。

Cannot start service xxx: Ports are not available: listen tcp 0.0.0.0:xxxxx: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

 こちらは以前の記事でも解説しましたが、カーネルが自動で占有しているポートが原因の可能性があるので、OSを再起動するか、Windowsであれば下記記事を参考に占有ポートをずらす事が可能です。

Unable to start the VM: C:\Program Files\Oracle\VirtualBox\VBoxManage.exe startvm default –type headless failed:

 こちらも最近は実環境で出くわすことは滅多になくなりましたが、DockerToolboxが入っている環境でDockerDesktopを稼働させようとして出くわすエラーですね。こちらに解説があります。

 また、Docker で環境構築時にハマりがちな何かがあれば追記していきます。これらの記事が少しでもDocker での環境構築に苦労しているどなたかのお役経てば幸いです。

モバイルバージョンを終了