それが僕には楽しかったんです。

僕と MySQL と時々 MariaDB

Dockerコンテナ内から外部通信が向いたときにDNSが解決できない問題を解消する

はじめに

どうも、最近海外ドラマで特にNetflix系のドラマにドハマりしているけんつです。

最近、Laradockを使うときにコンテナをビルドしたらDNSが解決できない問題に苦しめられていました。
なんかすごく詰まったのにあっさりと解決してしまったのでまとめます。

環境

  • Ubuntu16.04
  • Docker version 18.09.0, build 4d60db4
  • docker-compose version 1.23.0, build c8524dc1

問題

Laradockで色々とコンテナをビルドしていた時にこんなエラーが頻発して全然ビルドできなかった

Step 3/12 : RUN apk --update add wget   curl   git   build-base   libmemcached-dev   libmcrypt-dev   libxml2-dev   zlib-dev   autoconf   cyrus-sasl-dev   libgsasl-dev   supervisor
 ---> Running in 46add29caab7
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.8/main: temporary error (try again later)
WARNING: Ignoring APKINDEX.adfa7ceb.tar.gz: No such file or directory
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.8/community: temporary error (try again later)
WARNING: Ignoring APKINDEX.efaa1f73.tar.gz: No such file or directory
ERROR: unsatisfiable constraints:
  autoconf (missing):
    required by: world[autoconf]
  build-base (missing):
    required by: world[build-base]
  cyrus-sasl-dev (missing):
    required by: world[cyrus-sasl-dev]
  git (missing):
    required by: world[git]
  libgsasl-dev (missing):
    required by: world[libgsasl-dev]
  libmcrypt-dev (missing):
    required by: world[libmcrypt-dev]
  libmemcached-dev (missing):
    required by: world[libmemcached-dev]
  libxml2-dev (missing):
    required by: world[libxml2-dev]
  supervisor (missing):
    required by: world[supervisor]
  wget (missing):
    required by: world[wget]
  zlib-dev (missing):
    required by: world[zlib-dev]
ERROR: Service 'php-worker' failed to build: The command '/bin/sh -c apk --update add wget   curl   git   build-base   libmemcached-dev   libmcrypt-dev   libxml2-dev   zlib-dev   autoconf   cyrus-sasl-dev   libgsasl-dev   supervisor' returned a non-zero code: 11

なぜかfetchできないが、普通にターミナルからcurlなりwgetすると取得できたからdockerコンテナ 内部でDNSを解決できていないのかと考えていた。

それとworkspaceのビルドする際にcomposerを走らせる段階でこんなエラーもでる

Changed current directory to /home/laradock/.composer
Loading composer repositories with package information

                                                                                                                                                              
  [Composer\Downloader\TransportException]                                                                                                                    
  The "https://packagist.org/packages.json" file could not be downloaded: php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution  
  failed to open stream: php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution                    


composer diagをしてみてもこの通り

Checking platform settings: OK
Checking git settings: OK
Checking http connectivity to packagist: WARNING
[Composer\Downloader\TransportException] The "http://packagist.org/packages.json" file could not be downloaded: php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution
failed to open stream: php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution
Checking https connectivity to packagist: WARNING
[Composer\Downloader\TransportException] The "https://packagist.org/packages.json" file could not be downloaded: php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution
failed to open stream: php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution
Checking github.com rate limit: FAIL
[Composer\Downloader\TransportException] The "https://api.github.com/rate_limit" file could not be downloaded: php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution
failed to open stream: php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution
Checking disk free space: OK
Checking pubkeys: FAIL
Missing pubkey for tags verification
Missing pubkey for dev verification
Run composer self-update --update-keys to set them up
Checking composer version: 


完全にご臨終してしまう

解決策

qiita.com

↑これをやったら想定した動作をした。

実際には全ておこなったわけではなくて


「dockerのホストであるUbuntuでは、デフォルトでdnsmasq が有効になっていて、 /etc/resolv.confが下記のように自分を見る設定になっている。」
この部分を見て /etc/resolv.conf に

nameserver 8.8.8.8
nameserver 8.8.4.4

を追記したて Docker を再起動するだけで、DNSでコケることがなくなった

おわりに

いつからこうなったんだ…