Ubuntu16の公式Dockerイメージには/etc/servicesや/etc/protocolsが入っていない
初期状態では一部のネットワーク系API(getprotobynameとかgetaddrinfoとか)が失敗する。
ネットワーク系のアプリやライブラリを使う際にエラーが起きると、原因究明に難渋する場合がある。
(こんなファイルがないとか、なかなか想像しないですよね?)
対策
問題のファイル群はnetbase
パッケージに含まれている模様。入れましょう。
sudo apt install netbase
問題の実例
例えば、こんな問題が起きた:
メッセージキューのライブラリであるQpid Protonを使用。
通信先のポート番号を明示的に指定した場合は問題なく動くが、明示指定しないと処理が永久に進まなくなるという不具合が発生。
調べたところ、以下の機序で無限ループしていた。
- Qpid ProtonがAMQPのデフォルトポート番号をgetaddrinfo()で解決しようとする
- /etc/servicesがないので、APIが失敗
- Qpid Protonが(なぜか)失敗時に無限にリトライする実装になっているため、最初に戻る
その他
Ubuntu16のdockerイメージの他、それをベースにしたdockerイメージにも入っていない場合があるので注意。
Ubuntu16ベースのNVIDIA cudaイメージとか。
Dockerfileを書くときはパッケージを--no-install-recommendsで入れることが多いので、依存関係による自動導入もされにくい。Ubuntuをミニマム構成でインストールした場合にも入らないかも?(未確認)。
ぐち
これくらい最初から入れといてくれてもいいのに…
(障害票の閉じられ方を見るに、by designなのか?)