Seleniumを使った時間のかかるPythonスクリプトがあり、こいつを動かすとフォーカス取られて仕事にならないので、docker化し、ヘッドレス環境で実行するようにした
Dockerfile
ChromeDriverとSeleniumをインストール
FROM python:3.6-alpine3.7 ENV APP_ROOT=${APP_ROOT:-/opt/app} # update apk repo RUN echo "http://dl-4.alpinelinux.org/alpine/v3.7/main" >> /etc/apk/repositories && \ echo "http://dl-4.alpinelinux.org/alpine/v3.7/community" >> /etc/apk/repositories # install chromedriver RUN apk update RUN apk add chromium chromium-chromedriver # install selenium RUN pip install selenium WORKDIR $APP_ROOT/scripting
Makefile
DOCKER=docker scripting: $(DOCKER) build -t scripting -f Dockerfile .
イメージをビルドする
make scripting
docker-compose.yml
version: '2' services: script: image: scripting volumes: - .:/opt/app/scripting:rw
script.py
ヘッドレス環境で実行するテスト用スクリプト
from selenium import webdriver URL = 'https://www.google.co.jp/' def main(): options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--no-sandbox') driver = webdriver.Chrome(chrome_options=options) driver.get(URL) print(driver.title) driver.close() driver.quit() main()
--headless
オプションでヘッドレスモード
--no-sandbox
オプションについては↓を参照
github.com
実行
> docker-compose run scripting python3 script.py
Google
動いた
日本語
日本語を表示するためにフォントを入れます
FROM python:3.6-alpine3.7 ENV APP_ROOT=${APP_ROOT:-/opt/app} # update apk repo RUN echo "http://dl-4.alpinelinux.org/alpine/v3.7/main" >> /etc/apk/repositories && \ echo "http://dl-4.alpinelinux.org/alpine/v3.7/community" >> /etc/apk/repositories # install chromedriver RUN apk update RUN apk add chromium chromium-chromedriver RUN apk add ttf-freefont # install selenium RUN pip install selenium # install font RUN mkdir /noto ADD https://noto-website.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip /noto WORKDIR /noto RUN unzip NotoSansCJKjp-hinted.zip && \ mkdir -p /usr/share/fonts/noto && \ cp *.otf /usr/share/fonts/noto && \ chmod 644 -R /usr/share/fonts/noto/ && \ fc-cache -fv WORKDIR $APP_ROOT/scraping