【Docker】コンテナから外部サイトにアクセスできず、Imageのbuildに失敗する

はじめに

こんにちは、SHOJIです。

Ruby on Rails 6 実践ガイド」という書籍をハンズオンで流していたときに遭遇したエラーです。本が悪いわけではなく、環境によっては今後も遭遇するであろう内容なので備忘録として残します。

docker-compose up -d が通らない

書籍の手順に沿ってGitから指定のリポジトリをダウンロードし、 docker-compose up -d したところ、Run bundle install コマンドのところで以下のエラーが発生しました。

Retrying fetcher due to error (2/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/ Retrying fetcher due to error (3/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/ Retrying fetcher due to error (4/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/ Could not fetch specs from https://rubygems.org/ ERROR: Service 'web' failed to build: The command '/bin/sh -c bundle install' returned a non-zero code: 17

調査の流れ

ログから docker-compose.yml で定義しているweb serviceのビルド時に発生していることがわかったので、そこから順番に調査を行いました。

  1. web serviceのbuildを見て、同階層のDockerFileを基にビルドしていることを確認
  2. DockerFileのFROMを見て、使用しているImageとバージョンを確認
  3. docker run -dit [Image name & version] コマンドでImageからクリーンなコンテナを作成
  4. docker exec -it [Container id] /bin/bash コマンドでコンテナにアクセス
  5. ping rubygems.org コマンドで接続できないことを確認
  6. コンテナから抜けて、ホスト側でping rubygems.org コマンドで接続できることを確認
  7. 同じくホスト側でnslookup rubygems.org コマンドでIPアドレスを確認
  8. 再びコンテナに入り、ping [IPアドレス] コマンドで、IPアドレス指定なら接続できることを確認 !DNSに問題がある!
  9. echo 'nameserver 8.8.8.8' >> /etc/resolv.conf && ping rubygems.org コマンドで接続できることを確認
    ※8.8.8.8はGoogleが提供しているDNSサーバ

解決方法

ここまでの調査でDNSサーバの設定ができていないことが原因であることはわかっています。そのため、あまりスマートとは言えない解決方法ですが、DockerFileのエラーの出るコマンドの前に echo 'nameserver 8.8.8.8' >> /etc/resolv.conf && と付けてあげれば解消できます。

おわりに

同じ手順をMacで行うとエラーが出ないんですよね。同じImageからコンテナを作っているのにホスト環境によって結果が違うのが不思議です。いつものごとく、そこまでは調べる時間が惜しいので一旦ここまでで終わりたいと思います。