1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Dockerコンテナでパッケージインストール時にエラーとなった際にやったこと

Posted at

環境

  • Arch Linux
  • Docker 20.10.5

何があったか

GASの勉強のためにDockerでclaspを導入した環境を構築しようとしたら、何度やってもnpmインストールでエラーになる。。

$ docker-compose up -d --build
Building gas
Sending build context to Docker daemon  4.608kB
〜 中略 〜
Step 3/3 : RUN npm i @google/clasp -g
 ---> Running in 8821bf6923b3
npm ERR! code EAI_AGAIN
npm ERR! errno EAI_AGAIN
npm ERR! request to https://registry.npmjs.org/@google%2fclasp failed, reason: getaddrinfo EAI_AGAIN registry.npmjs.org

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2021-03-11T14_04_40_662Z-debug.log
The command '/bin/sh -c npm i @google/clasp -g' returned a non-zero code: 1
ERROR: Service 'gas' failed to build
$

色々調べる中で試しにUbuntuのコンテナからaptコマンドを叩いてみたら、リポジトリにアクセスできないことが判明。
どうやらコンテナからインターネットにアクセスできない状態にあったみたい。

$ docker container run -it --rm ubuntu:20.04
root@46600d291397:/# apt update
Err:1 http://archive.ubuntu.com/ubuntu focal InRelease                   
  Temporary failure resolving 'archive.ubuntu.com'
Err:2 http://security.ubuntu.com/ubuntu focal-security InRelease         
  Temporary failure resolving 'security.ubuntu.com'
Err:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease           
  Temporary failure resolving 'archive.ubuntu.com'
Err:4 http://archive.ubuntu.com/ubuntu focal-backports InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Reading package lists... Done        
Building dependency tree       
Reading state information... Done
All packages are up to date.
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal-updates/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal-backports/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/focal-security/InRelease  Temporary failure resolving 'security.ubuntu.com'
W: Some index files failed to download. They have been ignored, or old ones used instead.
root@46600d291397:/# 

原因

ホストOS側のファイアウォール設定が原因だった。

調べたこと/やったこと

DNS

npmのエラーメッセージ reason: getaddrinfo EAI_AGAIN registry.npmjs.org でググると、コンテナのDNS設定が怪しい!という情報がいっぱい出てきた。
デフォルトではホストOSの/etc/resolv.conf設定がコンテナに反映されるらしい。

$ cat /etc/resolv.conf
nameserver 192.168.1.100
$
$ docker container run -it --rm ubuntu:20.04
root@58673efbfcd1:/# cat /etc/resolv.conf
nameserver 192.168.1.100
root@58673efbfcd1:/# 

コンテナ内のDNS参照先を変更するには、コンテナ起動時に--dnsオプションで指定するやり方と、

$ docker container run -it --rm --dns 8.8.8.8 ubuntu:20.04
root@fe87f1509fdf:/# cat /etc/resolv.conf
nameserver 8.8.8.8
root@fe87f1509fdf:/# 

ホストOS側でデーモン設定ファイル(/etc/docker/daemon.json)を編集するやり方があるみたい。

$ sudo vim /etc/docker/daemon.json
/etc/docker/daemon.json
{
    "dns": ["8.8.8.8", "8.8.4.4"]
}
$ sudo systemctl restart docker
$ docker container run -it --rm ubuntu:20.04
root@c42a4279a14f:/# cat /etc/resolv.conf 
nameserver 8.8.8.8
nameserver 8.8.4.4
root@c42a4279a14f:/# 

ただ、今回の場合はファイアウォール設定が原因だったため、この対応では事象を解決できなかった。。

ファイアウォール

色々調べ回っているときに、Dockerコンテナからインターネットに繋がらないときに確認すること - Qiita に行き当たる。
iptablesとfirewalldの設定を確認するように、との項目を見て、嫌な予感が。。
試しにホストOS側でnftablesを停止してみたら、aptコマンドでリポジトリにアクセスできた!

その後こちらの記事 Docker と nftables - eagletmt's blog にもたどり着き、nftablesを使っている環境では色々と支障があることがわかった。。
最終的にはArchWikiにもきちんと記載があることに気付く。

対応

nftablesからiptablesに変更する記事なども散見されるけれど、今回はnftablesの設定を変更することにした。
ArchWikiを参考に修正。

The factual accuracy of this article or section is disputed.
Reason: This section is not correct. The default docker forward policy is accept. This might end in an insecure forward chain...

とあるのは気にかかるが、個人の環境だから目を瞑ることにする。。

$ sudo pacman -S iptables-nft
$ sudo cp -p /etc/nftables.conf{,.org}
$ sudo vim /etc/nftables.conf
/etc/nftables.conf
#!/usr/bin/nft -f
# ipv4/ipv6 Simple & Safe Firewall
# you can find examples in /usr/share/nftables/

table inet filter {
  chain input {
    type filter hook input priority 0;

    # allow established/related connections
    ct state {established, related} accept

    # early drop of invalid connections
    ct state invalid drop

    # allow from loopback
    iifname lo accept

    # allow icmp
    ip protocol icmp accept
    meta l4proto ipv6-icmp accept

    # allow ssh
    tcp dport ssh accept

    # everything else
    reject with icmpx type port-unreachable
  }
  chain forward {
    type filter hook forward priority 0;
    mark 1 accept  # Docker
    drop
  }
  chain output {
    type filter hook output priority 0;
  }

}

# Docker
table ip filter {
  chain DOCKER-USER {
    mark set 1
  }
}

# vim:set ts=2 sw=2 et:
$ sudo systemctl restart nftables
$ sudo systemctl restart docker
$ docker container run -it --rm ubuntu:20.04
root@f554e294f10c:/# apt update
Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [109 kB]  
Get:2 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]            
Get:3 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [659 kB]
Get:4 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
Get:5 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 Packages [21.6 kB]
Get:6 http://security.ubuntu.com/ubuntu focal-security/universe amd64 Packages [681 kB]
Get:7 http://archive.ubuntu.com/ubuntu focal-backports InRelease [101 kB]    
Get:8 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [178 kB]
Get:9 http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages [11.3 MB]
Get:10 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages [1275 kB]                                                               
Get:11 http://archive.ubuntu.com/ubuntu focal/restricted amd64 Packages [33.4 kB]                                                         
Get:12 http://archive.ubuntu.com/ubuntu focal/multiverse amd64 Packages [177 kB]                                                          
Get:13 http://archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [210 kB]                                                  
Get:14 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [1066 kB]                                                       
Get:15 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [938 kB]                                                    
Get:16 http://archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [29.6 kB]                                                 
Get:17 http://archive.ubuntu.com/ubuntu focal-backports/universe amd64 Packages [4301 B]                                                  
Fetched 17.2 MB in 9s (1961 kB/s)                                                                                                         
Reading package lists... Done
Building dependency tree       
Reading state information... Done
11 packages can be upgraded. Run 'apt list --upgradable' to see them.
root@f554e294f10c:/#

Dockerコンテナからインターネットにアクセスできるようになった。

あとがき

nftablesよくわからん。。もっと理解したい。。
あと、Podmanも試してみようかなという気になりました。
RHEL/CentOSの場合は以下が参考になりそうです。

1
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?