docker-compose+Rails5.1+rspec+HeadlessChromeでのサブドメインのテスト方法がわかりません
環境:
Rails: 5.1.5
Ruby: 2.5.0
capybara: 2.18.0
rspec-rails: 3.7.2
selenium-webdriver: 3.10.0
Docker初心者です。現在docker-composeで以下のように開発環境を作っており、その上でrspec(system spec)でcapybaraのテストを行っていますが、サブドメインのテストの方法がわからなくて困っています。
docker-compose.yml
services:
nginx:
image: nginx:alpine
container_name: my_nginx
links:
- app
ports:
- "80:80"
volumes:
- .:/app
depends_on:
- chrome
app:
build:
context: .
command: bash -c "rm -f tmp/pids/server.pid && ./bin/webpack-dev-server & bundle exec rails s -b 0.0.0.0 -p 3000"
working_dir: /app
container_name: my_app
hostname: app
ports:
- '3000:3000'
expose:
- 3000
volumes:
- .:/app
- rails_public:/app/public
- rails_log:/app/log
- bundle:/app/vendor/bundle
- /app/node_modules
links:
- postgres
- redis
depends_on:
- postgres
- chrome
tty: true
stdin_open: true
environment:
WEBPACKER_DEV_SERVER_HOST: 0.0.0.0
chrome:
container_name: my_chrome
image: selenium/standalone-chrome
ports:
- 4444:4444
volumes:
- .:/app
〜中略〜
capybara.rb
require "capybara/rspec"
require "selenium-webdriver"
Capybara.register_driver :selenium_remote do |app|
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
chromeOptions: {
args: ["--headless", "--no-sandbox", "--disable--gpu", "--window-size=1280x800"],
},
)
Capybara::Selenium::Driver.new(app,
url: "http://chrome:4444/wd/hub",
browser: :remote,
desired_capabilities: capabilities)
end
Capybara.run_server = false
Capybara.default_driver = :selenium_remote
spec_helper.rbを以下の用に設定するとサブドメインでないテストは正常に実行されます。
RSpec.configure do |config|
config.before :each, type: :system do
driven_by :selenium_remote
Capybara.app_host = "http://{IPSocket.getaddress(Socket.gethostname)}"
Capybara.always_include_port = true
end
〜中略〜
ただ、サブドメインのテストの仕方がどうしてもわかりません。
イメージでは/etc/hosts
にappコンテナ起動かどこかのタイミングでIPを確認しサブドメインを割り当ててそこにアクセスする感じかなと考えているのですが、docker-compose上でextra_hostsなどを使ったりいい方法があればご教授して頂けると幸いです。よろしくお願いします。
試したこと:
①Capybara.app_host = "http://admin.{IPSocket.getaddress(Socket.gethostname)}"
→IPアドレスですのでできませんでした。
②appコンテナに入り/etc/hosts
でappコンテナのIPをadmin.app
に割当て、Capybara.app_host = "http://admin.app"
と設定
→そもそもCapybara.app_host = "http://app"
でもアクセスできず、Capybara.app_host = "http://app:3000"
にすると以下のエラーが出ます。
HTTP parse error, malformed request (): #<Puma::HttpParserError: Invalid HTTP format, parsing fails.>
③Capybara.app_host = "http://nginx"
と設定
→サブドメインでないところに接続できますが、なぜかdevelopmentのDBにアクセスしてしまいます()
④nginxコンテナに入り/etc/hosts
でnginxコンテナのIPをadmin.nginx
に割当て、Capybara.app_host = "http://admin.nginx"
と設定
→接続できませんでした。