Dockerコンテナにalpine linuxを使って、headlessなXサーバでSeleniumを動かせるようにする

Dockerコンテナ内で使うディストリビューションはAlpine Linuxがマイブームですm( )m

Dockerfileはこんな感じ。

FROM alpine:3.3

RUN apk update && \
apk add xvfb dbus firefox imagemagick ruby libffi && \
apk add --virtual=build-deps gcc make libc-dev ruby-dev libffi-dev && \
gem install --no-ri --no-rdoc selenium-webdriver && \
gem install --no-ri --no-rdoc json && \
dbus-uuidgen && \
mkdir /tests && \
apk del build-deps && \
rm -rf /var/cache/apk/*

ENV DISPLAY :1

CMD Xvfb :1 -screen 0 1024x768x24

とりあえず、xvfbを動かすのに必要なのがこれら。

dbusdbusパッケージにあるdbus-genuuidを実行しておかないと、xvfb実行時にエラーになります。

--virtualを使ってインストールしているところは、gemのインストール時にビルドが必要になるので、そこで使うものをグループ化してインストール。gemのインストールが終わったら消してます。

後はこのようなdocker-compose.ymlを作成。

version: "2"

services:
  selenium:
    hostname: selenium
    build: .
    volumes:
      - ./tests:/tests:rw

Dockerfileがあるディレクトリにtestsを作って、そこに下のファイルを置いて、

#!/usr/bin/env ruby

require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox 

driver.navigate.to "http://www.kernel.org"
driver.save_screenshot("./screenshot.png")

driver.quit

docker-compose upでコンテナを起動して、別のターミナルからdocker-compose execで起動中にコンテナに入って、/testsに移動してrubyのコードを動かすと、こんなスクリーンショットが撮れます。

f:id:masami256:20160528011844p:plain

Docker実践ガイド

Docker実践ガイド