実現したいこと
1、Dockerfileでコンテテを立ち上げて、そのコンテナ内(仮に親コンテナ)で、docker-composeのインストールおよび、docker-compose upを行う。(DooD)
2、親コンテナ内でのdockerコマンドで立ち上がった2つの子コンテナ(Chromiumのコンテナとrailsのコンテナ)を、同じネットワーク内に置いて、通信できる状況にしたい。
前提
・railsを用いたスクレイピングツールの作成したいと思っています。
・インフラコストを考慮して、常時稼働のサーバーは立ち上げず、AWS batchを用いたいため、docker runで起動するdockerイメージを作成したいと思ってます。
・上記を考慮して、DooDの手法を採用し、Dockerfileでコンテナを立ち上げた上で、その中で、docker-composeを用いています。
発生している問題・エラーメッセージ
docker runを実行した際、webサーバー(rails)が、ログ吐き出さずにすぐこけてしまいます、、
main-web-1 exited with code 0
docker runのログを見るに、
main-chrome-1 | [*******.***][SEVERE]: bind() failed: Cannot assign requested address (99)
ここがキーになると思っており、chrome(chromium)コンテナを4444ポートでポートバインドをしていますが、アクセスできていない状態になっております。
ネットワークの設定に問題があるのでは?と思っているのですが、解決の糸口がわからず、、お助け頂けますと幸いです。
該当のソースコード
ソースコード
Dockerfile
FROM alpine:latest # apkを使用して必要なパッケージをインストールする RUN apk update && \ apk add --no-cache \ bash \ build-base \ curl \ docker \ jq \ nodejs \ openssl \ openssh-client # Docker Composeをインストールする RUN LATEST_VERSION=$(curl --silent https://api.github.com/repos/docker/compose/releases/latest | jq -r .tag_name) && \ curl -L "https://github.com/docker/compose/releases/download/$LATEST_VERSION/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose && \ chmod +x /usr/local/bin/docker-compose # ユーザーをrootに変更する USER root RUN mkdir /main WORKDIR /main COPY . /main EXPOSE 4444 # Docker Composeを起動する CMD ["sh", "-c", "docker-compose up"]
docker-compose.yml
version: '3' services: web: build: context: . dockerfile: Dockerfile-web platform: linux/amd64 tty: true stdin_open: true volumes: - /var/run/docker.sock:/var/run/docker.sock depends_on: - chrome shm_size: '2gb' networks: - my-network chrome: image: seleniarm/standalone-chromium:latest ports: - "4444:4444" shm_size: '2gb' networks: - my-network networks: my-network:
railsで使用しているcapybaraの設定ファイル
require 'selenium-webdriver' Capybara.register_driver :remote_chrome do |app| options = Selenium::WebDriver::Chrome::Options.new( args: %w[ headless disable-gpu disable-dev-shm-usage window-size=1400,2000 no-sandbox download.default_directory=/tmp/csv ] ) Capybara::Selenium::Driver.new( app, browser: :remote, #chromeコンテナのIPがchrome(docker-composeで命名)、ポート番号が4444。 #wd/hubは、seleniumGridでWebDriverを操作するAPIのエンドポイント。 url: 'http://chrome:4444/wd/hub', options: options ) end # javascript_driverに上で登録したremote_chromeを指定する Capybara.javascript_driver = :remote_chrome Capybara.default_driver = :remote_chrome Capybara.server_host = '0.0.0.0' Capybara.server_port = '9999' #webコンテナのIPを取得して、capybaraのアドレスを設定 Capybara.app_host = "http://#{IPSocket.getaddress(Socket.gethostname)}:#{Capybara.server_port}"
docker起動時
docker run --privileged -v /var/run/docker.sock:/var/run/docker.sock scraping_data:latest

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。