Dockerコンテナでapt update が失敗するのを対応したメモ

ローカルで問題なくビルドできたDockerfileが、サーバに移した途端ビルド出来なくなったのを対応したメモ。


環境

  • OS: CentOS Linux release 7.2.1511 (Core)
  • Docker: 1.12.1
  • docker-compose: 1.8.0

Dockerfile

利用したのは簡単なDockerfile。
特に動作に問題はない。

Dockerfile
1
2
3
4
5
6
7
8
9
FROM node:5.12.0

RUN apt update
RUN apt install -y ruby

RUN npm install -g api-mock

EXPOSE 3000
CMD ["api-mock", "/app/mock.md"]

ローカルでは問題無いがサーバでaptがエラー

ローカルで一通り開発が出来たのでサーバに移してビルドしてみたとろ、apt updateでエラーが発生。

Terminal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ docker-compose build
Step 2 : RUN apt-get update
---> Running in 6447ed4d7e03
Err http://security.debian.org jessie/updates InRelease

Err http://security.debian.org jessie/updates Release.gpg
Could not resolve 'security.debian.org'
Err http://httpredir.debian.org jessie InRelease

Err http://httpredir.debian.org jessie-updates InRelease

Err http://httpredir.debian.org jessie Release.gpg
Could not resolve 'httpredir.debian.org'
Err http://httpredir.debian.org jessie-updates Release.gpg
Could not resolve 'httpredir.debian.org'
Reading package lists...
W: Failed to fetch http://httpredir.debian.org/debian/dists/jessie/InRelease

W: Failed to fetch http://httpredir.debian.org/debian/dists/jessie-updates/InRelease

W: Failed to fetch http://security.debian.org/dists/jessie/updates/InRelease

W: Failed to fetch http://security.debian.org/dists/jessie/updates/Release.gpg Could not resolve 'security.debian.org'

W: Failed to fetch http://httpredir.debian.org/debian/dists/jessie/Release.gpg Could not resolve 'httpredir.debian.org'

W: Failed to fetch http://httpredir.debian.org/debian/dists/jessie-updates/Release.gpg Could not resolve 'httpredir.debian.org'

W: Some index files failed to download. They have been ignored, or old ones used instead.

調べてみると、外部のDNSを参照出来ていないらしい。
/etc/resolv.conf というのに下記DNSサーバを指定すればいいとのこと。

Dockerfile
1
2
RUN echo  nameserver 8.8.8.8 >> /etc/resolv.conf
RUN echo nameserver 8.8.4.4 >> /etc/resolv.conf

しかし、再度試すも失敗。

docker-composeではなく直接起動してみる

--dns というオプションで起動できるみたいなので直接実行してみる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ docker run -it --rm --dns=8.8.8.8 --dns=8.8.4.4 node:5.12.0 apt update
Get:1 http://security.debian.org jessie/updates InRelease [63.1 kB]
Get:2 http://security.debian.org jessie/updates/main amd64 Packages [389 kB]
Ign http://httpredir.debian.org jessie InRelease
Get:3 http://httpredir.debian.org jessie-updates InRelease [142 kB]
Get:4 http://httpredir.debian.org jessie Release.gpg [2373 B]
Get:5 http://httpredir.debian.org jessie-updates/main amd64 Packages [17.6 kB]
Get:6 http://httpredir.debian.org jessie Release [148 kB]
Get:7 http://httpredir.debian.org jessie/main amd64 Packages [9032 kB]
Fetched 9795 kB in 19s (512 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
5 packages can be upgraded. Run 'apt list --upgradable' to see them.

問題無く動くが--dnsを外すと動かない。

DNSの設定はホストのresolv.confを参照していた

--dnsってどういうい仕様なんだろうとリファレンスを読んでいると、次の一文を見つけた。

Docker は各コンテナの /etc/resolv.conf をホストマシン上( docker デーモンが動作中 )の /etc/resolv.conf のように作成します。

コンテナのDNSを設定

ホストマシンのresolv.confがそのまま反映されるらしい。
さっそくホストマシンの/etc/resolv.confを確認してみる。

/etc/resolv.conf
1
nameserver 0.0.0.0

これのみの記載のため、先程のDNSをふたつ追加する。

/etc/resolv.conf
1
2
3
nameserver 0.0.0.0
nameserver 8.8.8.8
nameserver 8.8.4.4

この状態で再度ビルドすると正常にapt updateが実行できビルドが通った。

以上です。

© 2018 磁力式駆動 All Rights Reserved.
Theme by hiero