PostgreSQL 公式の DockerFile をビルドしたら gpg: keyserver receive failed: Address not available で落ちる


概要

PostgreSQL の公式の DockerFile を GitHub から取得して、ビルドしたところエラーが出てビルドできませんでした。

+ gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4

gpg: keybox '/tmp/tmp.TJGmsE5I4v/pubring.kbx' created
gpg: keyserver receive failed: Cannot assign requested address postgresql
keyserver receive failed: Cannot assign requested address postgresql

なにをやってもほぼ間違いなく上記のエラーが出るのですが、ごくまれに docker のビルドに成功するのです。

どういうことなのか、とはまってしまいました。


正解

GitHubのイシュー の F30 さんの方法で現象を回避できました。


(Came here through Google after having the same error in a different container.)

In my case, the error with [ha.]pool.sks-keyservers.net was related to IPv4 vs. IPv6: GPG's dirmngr might select a v6 server from the pool and try to connect to it, even though it doesn't have v6 connectivity inside the container.

I'm not sure whether this is a bug in Docker or dirmngr, but there is at least this bug related to dirmngr and IPv6.

If one wants stay with sks-keyservers, ipv4.pool.sks-keyservers.net can be used.


彼の説明によると、dirmngr が ipv6 のサーバーをプールから選択しているが、そのようなサーバーは存在しない、ということでした。

そのため、DockerFile 内のサーバー名を ipv4 のサーバーを明示したら確実に成功するようになりました。


DockerFile_変更前(postgre9.6)

# 31 行目

&& gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \

# 67 行目
gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \



DockerFile_変更後(postgre9.6)

# 31 行目

&& gpg --batch --keyserver ipv4.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \

# 67 行目
gpg --batch --keyserver ipv4.pool.sks-keyservers.net --recv-keys "$key"; \