作った環境まとめ(後ほど追記する可能性)
https://github.com/dich1/selenium_ruby
概要
Dockerでスクレイピングをselenium-rubyを使ってGUIで起動しつつ、ホストからも確認できる環境
初期設定
Homebrewを入れる
brew install socat
brew tap caskroom/cask
brew cask install xquartz
使い方
1. Docker for macを入れ、Dockerを起動する
2. ボリュームを作成する
docker volume create --name=mysql-data
3. プロジェクトのルートに移動する
4. イメージを作成、コンテナを起動する
docker-compose up -d
5.Mac側からのスクリプトGUI確認準備
別タブのターミナルを開いて下記を実行
open -a XQuartz
socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
XQuartzが開き、socatが起動中になっていることを確認
6. 動作確認
docker-compose run --rm -e DISPLAY=MACのIP(ifconfigのinet 192.168.~):0 app ruby /selenium_ruby/app/tests.rb
7. XQuartzが立ち上がり画面から処理がみえる事の確認
構成
$ tree
.
└── selenium_ruby(プロジェクト名)
├── README.md (環境構築、実行方法を記載)
├── app(アプリケーションコンテナ)
│ ├── Dockerfile(イメージ生成元ファイル)
│ ├── Gemfile(アプリケーションコンテナ内で使うRubyモジュール)
│ ├── google-chrome.repo(CentOSでchromeを使用するの必要なファイル)
│ └── tests.rb(テスト用スクリプトが記載されているファイル)
├── docker-compose.yml(アプリケーションコンテナとデータベースコンテナを管理するファイル)
├── local-setup.sh(初回時使うコマンドまとめ)
└── mysql(データベースコンテナ)
├── Dockerfile(イメージ生成元ファイル)
└── my.cnf(データベース設定ファイル)
アプリケーションコンテナDockerfileについて
主に下記の事をやっています。
- CentOSのイメージ取得
- rbenvに必要なモジュールのインストール、パス設定
- Rubyの設定
- Gemの設定
- プロジェクトをコンテナ内にマウント
- chromedriverに必要なモジュール取得
- firefoxdriver取得(なくても良い)
- コンテナを起動させ続ける
app/Dockerfile
FROM drecom/centos-base:latest
# rbenv
RUN git clone git://github.com/rbenv/rbenv.git /usr/local/rbenv \
&& git clone git://github.com/rbenv/ruby-build.git \
/usr/local/rbenv/plugins/ruby-build \
&& git clone git://github.com/jf/rbenv-gemset.git \
/usr/local/rbenv/plugins/rbenv-gemset \
&& /usr/local/rbenv/plugins/ruby-build/install.sh
ENV PATH="/usr/local/rbenv/bin:$PATH" \
RBENV_ROOT="/usr/local/rbenv"
RUN echo 'export RBENV_ROOT=/usr/local/rbenv' >> /etc/profile.d/rbenv.sh \
&& echo 'export PATH=/usr/local/rbenv/bin:$PATH' >> /etc/profile.d/rbenv.sh \
&& echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh
RUN echo 'export RBENV_ROOT=/usr/local/rbenv' >> /root/.bashrc \
&& echo 'export PATH=/usr/local/rbenv/bin:$PATH' >> /root/.bashrc \
&& echo 'eval "$(rbenv init -)"' >> /root/.bashrc
ENV CONFIGURE_OPTS="--disable-install-doc" \
PATH="/usr/local/rbenv/bin:/usr/local/rbenv/shims:$PATH"
# ruby
RUN eval "$(rbenv init -)"; rbenv install 2.3.3 \
&& eval "$(rbenv init -)"; rbenv global 2.3.3 \
&& eval "$(rbenv init -)"; gem update --system \
&& eval "$(rbenv init -)"; gem install bundler --no-document --force
# project setting
RUN mkdir /selenium_ruby
WORKDIR /selenium_ruby
COPY . /selenium_ruby/app
WORKDIR /selenium_ruby/app
RUN bundle install
WORKDIR /
# chromedriver
ARG CHROME_DRIVER_VER=2.44
RUN yum install -y unzip
RUN curl -O https://chromedriver.storage.googleapis.com/${CHROME_DRIVER_VER}/chromedriver_linux64.zip
RUN unzip chromedriver_linux64.zip
RUN mv chromedriver /usr/local/bin/
# dependencies
RUN yum install -y libX11 \
GConf2 \
fontconfig
# chrome
COPY ./google-chrome.repo /etc/yum.repos.d/google-chrome.repo
RUN yum install -y google-chrome-stable \
libOSMesa
RUN yum install -y google-noto-cjk-fonts \
ipa-gothic-fonts
# xvfb
RUN yum install -y zlib-devel xorg-x11-server-Xvfb gtk+-devel gtk2-devel
RUN yum groupinstall -y base "Development Tools" --setopt=group_package_types=mandatory,default,optional
# firefox
ENV FF_LANG="ja" \
FF_BASE_URL="https://archive.mozilla.org/pub" \
FF_PLATFORM="linux-x86_64" \
FF_INNER_PATH="firefox/releases"
ARG FF_VER="45.7.0esr"
ENV FF_COMP="firefox-${FF_VER}.tar.bz2"
ENV FF_URL="${FF_BASE_URL}/${FF_INNER_PATH}/${FF_VER}/${FF_PLATFORM}/${FF_LANG}/${FF_COMP}"
RUN cd /opt \
&& wget -nv "${FF_URL}" -O "firefox.tar.bz2" \
&& bzip2 -d "firefox.tar.bz2" \
&& tar xf "firefox.tar" \
&& rm "firefox.tar" \
&& ln -fs /opt/firefox/firefox /usr/bin/firefox \
&& chmod -R 777 /opt/firefox
CMD tail -f /dev/null
データベースコンテナについて
主に以下のことをやっています。
- データベースのイメージ取得
- モジュールの最新化
- 設定ファイルをコンテナ内にマウント
mysql/Dockerfile
FROM mysql:5.6
RUN apt-get update
RUN apt-get install -y locales
ADD ./my.cnf /etc/mysql/conf.d/my.cnf
mysql設定ファイル
my.cnf
[mysqld]
character-set-server=utf8mb4
[mysql]
default-character-set=utf8mb4
[client]
default-character-set=utf8mb4
docker-compose.ymlについて
主に以下のことをやっています。
- 2つのコンテナをまとめて管理(起動時の起点のファイル)
docker-compose.yml
version: '3'
services:
db:
build: ./mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: root
TZ: Asia/Tokyo
volumes:
- mysql-data:/var/lib/mysql
app:
build: ./app
volumes:
- .:/selenium_ruby
links:
- db
volumes:
mysql-data:
external: true