質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

1回答

1824閲覧

Rails on Docker から api を叩いた際の Errno::EADDRNOTAVAIL

tat_23

総合スコア18

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/08/15 07:20

編集2020/08/15 07:30

やりたいこと

  • Rails の Book モデルから google books api を叩いて書籍情報のレスポンスを取得したい

発生したエラー

web_1 | Errno::EADDRNOTAVAIL (Failed to open TCP connection to :80 (Address not available - connect(2) for nil port 80)): web_1 | web_1 | app/models/book.rb:24:in `search' web_1 | app/controllers/books_controller.rb:3:in `search'

コード

フォームから送られてきたキーワード(書籍名や著者など)を使って API を叩きます。

class BooksController < ApplicationController def search @results = Book.search(params[:book_search][:search_key_word]) end end

日本語が含まれるので、 url_encode メソッドでエンコードしています。

class Book < ApplicationRecord class << self def search(key_word) api_endpoint = ERB::Util.url_encode("https://www.googleapis.com/books/v1/volumes?q=#{key_word}&maxResults=20") response = Net::HTTP.get(URI.parse(api_endpoint)) # ここで上記のエラーが発生しています。 JSON.parse(response) end end end

同じエンドポイントに対して curl を実行すると当然適切にレスポンスが返ります。

dockerを使っていることが何か関係しているのでしょうか?
alpine linux をベースにしています。
https://hub.docker.com/layers/ruby/library/ruby/2.6.6-alpine/images/sha256-95d5b6bf7084a6a0f04b48a7fc1c533ccb15e1550c670ff589ef56e620f40286?context=explore

環境

  • docker 2.3.0.4
  • docker-compose 3.8
  • railsコンテナbaseイメージ ruby:2.6.6-alpine
  • ruby 2.6.6
  • rails 6.0.3.2

何か分かることがあればご教授頂けますと幸いです。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

dockerのコンテナ内で名前解決できてないのかもしれないですね。
コンテナの中に入って、digコマンド、nslookupコマンドを実行して確認してみてください(コンテナ内でcurlで実行するでも良いです)

投稿2020/08/15 07:24

koskacts

総合スコア145

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tat_23

2020/08/15 07:33

ご回答ありがとうございます。 コンテナ内から curl を叩いても正常にレスポンスがありますね。。。そもそも Docker は関係無いのかもしれませんが。 ``` curl https://www.googleapis.com/books/v1/volumes?q=hoge { "kind": "books#volumes", "totalItems": 495, "items": [ { "kind": "books#volume", "id": "lSKISZ57a-gC", "etag": "dHbSohOOUAE", "selfLink": "https://www.googleapis.com/books/v1/volumes/lSKISZ57a-gC", "volumeInfo": { "title": "Moses Drury Hoge", "subtitle": "Life and Letters", 以下略 ```
koskacts

2020/08/16 02:21

遅れました。 よく見てみたらport80番でアクセスしてエラーになってるように見えますよね。 httpsなので、port443にアクセスしないといけないんじゃないですかね。 gem 'net/https'を使ったりすればできそうですね
tat_23

2020/08/16 06:44

ありがとうございます、そのことがヒントになり解決しました。 原因としては、 ``` ERB::Util.url_encode("https://www.googleapis.com/books/v1/volumes?q=#{key_word}&maxResults=20") ``` この部分でエンコードした時に返ってくる文字列をそのまま `URI.parse` に渡すと、`URI::Generic` が返っていました。uri.host も、uri.scheme もnil になっていて正しく取得できていなかったようです。 それをそのまま Net::HTTP.get に渡しているので表題のようなエラーとなっていました。 `URI.encode` が非推奨のため、他のメソッドでエンコードしたかったです。 最終的には、WEBrick::HTTPUtils.#escape を使ってエンコードした文字列を URI.parse すると URI::HTTP のインスタンスが返り、scheme なども正しくセットされた状態となり解決しました。 本当にありがとうございました! - 参考 ``` def search(key_word) uri = URI.parse(WEBrick::HTTPUtils.escape("https://www.googleapis.com/books/v1/volumes?q=#{key_word}&maxResults=20")) response = Net::HTTP.get_response(uri) JSON.parse(response.body) end ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問