【Selenoid -1】コンテナ専用クライアントマシン Selenoidをdocker-composeで構築する

■はじめに

Selenoidはaerokubeが提供してくれているコンテナ専用のselenium-grid、及びクライアント環境です。
まずはこのプロダクトを作成したaerokubeの皆さまやコントリビュータの方々に感謝と敬意を評します。

aerokube.com

■Selenoidって何だ

既に偉大な先人の方々がブログ等で紹介してくださっています。
とってもわかりやすい。ボクもこちらのブログを見て導入を始めたクチです。感謝。

www.kaizenprogrammer.com

(注1)
ちなみにgoogle検索すると「あなたの検索したいのこれじゃね?」ってやつで
solenoid(電磁石)ってものが何度もサジェストされますが全く別物ですのでお間違いなきよう。


(注2)
web画面のテスト界隈では有名なプロダクトとして
selenideってやつもあって紛らわしいですがこれも全く別物です。
ややこしや。。

普通はブラウザ環境を動かすためだけにサーバを建てなければならないですが、Selenoidを使えば、例えばdocker-engineが動いていさえすれば簡単に起動・破棄をすることができます。

基本的な情報としては、上記ブログの内容がとてもわかりやすいので
それ以外のことを何回かのシリーズにしてエントリにします。

■docker-composeで構築する

さて、早速今回の本題であるdocker-compose.ymlを見てみましょう。

version: "3.7"
services:
  selenoid:
    container_name: selenoid
    image: aerokube/selenoid:1.10.0
    network_mode: bridge
    restart: always
    ports:
      - "4444:4444"
    volumes:
      - "./config:/etc/selenoid"
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "./video/:/opt/selenoid/video/"
      - "./logs/:/opt/selenoid/logs/"
    environment:
      - OVERRIDE_VIDEO_OUTPUT_DIR=/path/to/selenoid/video
    command: >
      -conf /etc/selenoid/browsers.json
      -video-output-dir /opt/selenoid/video
      -log-output-dir /opt/selenoid/logs
    healthcheck:
      test: ["CMD-SHELL", "stat /opt/selenoid/logs/ || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 3
      start_period: 30s
  videorecorder:
    container_name: video-recorder
    image: selenoid/video-recorder:latest-release
    restart: always
    healthcheck:
      test: ["CMD-SHELL", "stat /var/ || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 3
      start_period: 30s

参考となるサイトが、公式のGitHub上にも上がっていますので、こちらも合わせて確認することをお勧めします。

github.com

構築にあたってポイントがいくつかあります。

①Selenoidで起動するブラウザイメージは予めpullしておくこと

selenoidはクラアントマシンの起動を司っているだけで、クライアントマシンそのものではありません。
ですので先にimageをpullしておきましょう。

docker image pull selenoid/chrome:83.0
docker image pull selenoid/chrome:82.0
docker image pull selenoid/firefox:76.0

selenoidはバージョンを指定起動ができます。
逆にピンポイントで指定のブラウザバージョンを構築する場合は個別にpullする必要があります。

②Video録画をする場合はVideoイメージを構築すること

Selenoidは実行状況をVideoで残すことができます。 が、Selenoidとは別にコンテナ起動しないといけません。
docker-composeではvideorecorderという項目でサービス列挙しています。

そして実はこいつの起動にはとてもリソースを食います。
複数ジョブでVideoを撮ったりすると、あっという間に応答しなくなります。
リソースにめちゃくちゃ余裕がある時以外は切っておくことをお勧めします。

public static void main(String[] args){
    DesiredCapabilities desiredcapabilities = new DesiredCapabilities();
    //video撮影するかどうか
    desiredcapabilities.setCapability("enableVideo", "false");
}

また、もしかしたらもう解消しているかもしれませんが
たまにVideo撮影が空振って真っ黒の動画が残ったりします。。
のでエビデンスとしてはあくまで補助的に使うことをボクはお勧めします。
(画面操作で不具合が出たので特定のために一時的に動画撮影する、とか)

■実行してみましょう

selenoid % docker-compose up -d
Creating network "selenoid_default" with the default driver
Creating video-recorder ... done
Creating selenoid       ... done
selenoid % 

selenoid % docker-compose ps
     Name                   Command                       State                    Ports         
-------------------------------------------------------------------------------------------------
selenoid         /usr/bin/selenoid -listen  ...   Up (healthy)            0.0.0.0:4444->4444/tcp 
video-recorder   /entrypoint.sh                   Up (healthy)   

起動できましたね!
selenoidが4444ポートをListenしているので、こちらをターゲットとして対象ブラウザ、ブラウザバージョンを指定の上、remotedriverを実行すればクライアントマシン上でブラウザ操作が実行されます。

さて次回はaerokubeのプロダクトのひとつ、ggr(go grid router)について予定しています。

ではでは。