ずっと出来ないと勘違いしてたのですが、Dockerの中でDockerって動かせるんですね。知りませんでした。
調べたら2013年頃の記事に「出来るようになったやで」と書いてありました。お恥ずかしい。
https://blog.docker.com/2013/09/docker-can-now-run-within-docker/
さて、Dockerの中でDockerが動くなら、Dockerの中でdocker-composeも動くわけで、ということはGitLab CIのDocker Executorの中でもdocker-composeを使って環境構築が出来るわけですね。
ちょうどSeleniumの実行環境をCIに乗せたいと思っていたので、せっかくなのでSelenium GridでChromeとFirefoxが動く環境をdocker-composeで構築してみました。
TL;DR
以下の2ファイルをプロジェクトルートに配置すればOKです。
outsrc:
image: docker:stable
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
services:
- docker:dind
before_script:
- apk update
- apk add --no-cache py-pip
- pip install docker-compose
script:
- docker-compose up -d
- # このへんにあなたのテストスクリプトを入れてね
version: '2'
services:
hub:
image: selenium/hub
ports:
- 4444:4444
firefox:
image: selenium/node-firefox
volumes:
- /dev/shm:/dev/shm
depends_on:
- hub
environment:
HUB_HOST: hub
chrome:
image: selenium/node-chrome
volumes:
- /dev/shm:/dev/shm
depends_on:
- hub
environment:
HUB_HOST: hub
ハマったところ
Selenium Hubへのアクセス
お使いのテストフレームワーク上で、Seleniumのホストを指定するところがあると思いますが、ここの指定は
- ホストOS上で実行する場合:
docker
- テストコードもdocker-compose上のコンテナで実行する場合:
hub
となります。ホストOS上で実行する際、 localhost
では動きませんので注意が必要です。
使うイメージは node
とついてるほう
最初Seleniumの事を良く知らなくてハマったのですが、今回のようにSelenium Grid、つまり1つのHubと複数のNode(ブラウザがインストールされたコンテナ)で実行するときは、 selenium/node-***
を選ぶ必要があります。
selenium/standalone-***
は使えませんので注意してください!