LoginSignup
1
0

More than 3 years have passed since last update.

Ubuntu16の公式Dockerイメージには/etc/servicesや/etc/protocolsが入っていない

Posted at

Ubuntu16の公式Dockerイメージには/etc/servicesや/etc/protocolsが入っていない

初期状態では一部のネットワーク系API(getprotobynameとかgetaddrinfoとか)が失敗する。

ネットワーク系のアプリやライブラリを使う際にエラーが起きると、原因究明に難渋する場合がある。
(こんなファイルがないとか、なかなか想像しないですよね?)

対策

問題のファイル群はnetbaseパッケージに含まれている模様。入れましょう。

sudo apt install netbase

問題の実例

例えば、こんな問題が起きた:

メッセージキューのライブラリであるQpid Protonを使用。
通信先のポート番号を明示的に指定した場合は問題なく動くが、明示指定しないと処理が永久に進まなくなるという不具合が発生。

調べたところ、以下の機序で無限ループしていた。

  1. Qpid ProtonがAMQPのデフォルトポート番号をgetaddrinfo()で解決しようとする
  2. /etc/servicesがないので、APIが失敗
  3. Qpid Protonが(なぜか)失敗時に無限にリトライする実装になっているため、最初に戻る

その他

  • Ubuntu16のdockerイメージの他、それをベースにしたdockerイメージにも入っていない場合があるので注意。
    Ubuntu16ベースのNVIDIA cudaイメージとか。
    Dockerfileを書くときはパッケージを--no-install-recommendsで入れることが多いので、依存関係による自動導入もされにくい。

  • Ubuntuをミニマム構成でインストールした場合にも入らないかも?(未確認)。

ぐち

これくらい最初から入れといてくれてもいいのに…

(障害票の閉じられ方を見るに、by designなのか?)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0