背景
VPS上で稼働しているDebian+Docker環境において、 docker compose build 実行時にnode.jsのプロセスマネージャーpm2をグローバルインストールしようとしたところ、 getaddrinfo EAI_AGAIN registry.npmjs.org エラーが発生した。
docker compose build
# FROM node:22.18-slim
...
 > [ 7/11] RUN npm install -g pm2:
71.04 npm error code EAI_AGAIN
71.04 npm error syscall getaddrinfo
71.04 npm error errno EAI_AGAIN
71.04 npm error request to https://registry.npmjs.org/pm2 failed, reason: getaddrinfo EAI_AGAIN registry.npmjs.org
71.04 npm error A complete log of this run can be found in: /root/.npm/_logs/2025-08-11T06_41_13_651Z-debug-0.log
------
WARNING: current commit information was not captured by the build: failed to read current commit information with git rev-parse --is-inside-work-tree
Dockerfile:35
--------------------
  33 |     
  34 |     # Install PM2 globally
  35 | >>> RUN npm install -g pm2
  36 |     
  37 |     # switch non-root user
--------------------
...
原因を調べてみたところ、ドメイン名の名前解決にIPv6を使用しており、IPv6での外部通信に失敗している可能性が高そうだった。
# (一部伏せ字)
$ cat /etc/resolv.conf
nameserver 24XX:XXXX:XXXX:XXXX::11
nameserver 24XX:XXXX:XXXX:XXXX::12
$ docker network inspect bridge
[
    {
        ...
        "Driver": "bridge,
        "EnableIPv4": true,
        "EnableIPv6": true,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                },
                {
                    "Subnet": "fdXX:XXXX:XXXX::/64",
                    "Gateway": "fdXX:XXXX:XXXX::1"
                }                
            ]      
        },
        ...
当該環境はファイアーウォール(FW)設定に ufw を使用しており、HostのFW設定とDockerのFW設定が入り混じっている。
影響を鑑みてFWの設定変更を行わずに、どうにかIPv4とIPv6を両対応させようと試みたが、DockerがIPv6有効のままだとビルドエラー解消ができなかったため、最終的にDockerについては一旦IPv4で名前解決を行う形にした。
sudo vim /etc/docker/daemon.json
{
  "dns": ["1.1.1.1", "1.0.0.1"]
}
sudo systemctl restart docker
Dockerのネットワーク設定を再度確認。
$ docker network inspect bridge
[
    {
        ...
        "Driver": "bridge",
        "EnableIPv4": true,
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
"EnableIPv6": false になっていることを確認して、再度 docker compose build を実行。
docker compose build
...
=> [ 7/11] RUN npm install -g pm2                       7.3s
...
無事エラー解消できた。
当面はこれでしのぐことにする。
また新しい環境を構築する際はIPv6にもチャレンジしてみたい。
メモ:実行環境
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye
$ docker -v
Docker version 28.3.2, build 578ccf6
参考文献