0
0

More than 1 year has passed since last update.

[Docker] seleniumでUserProfileを利用する

Posted at

前置き

 こんにちは。Dockerを用いたpython環境でseleniumを利用しようとした際、UserProfileを利用するところで詰まったので共有します。調べたところによると、この不具合はlinux環境のみで生じるようです。

TL;DR

FROM joyzoursky/python-chromedriver:3.7-selenium

ARG UID=1000
ARG GID=1000
ARG USERNAME=hoge
ARG GROUPNAME=fuga
# UID, GIDはDockerを利用するユーザーに合わせる
# `id`コマンドで確認可能

RUN groupadd -g $GID $GROUPNAME && \
    useradd -m -s /bin/bash -u $UID -g $GID $USERNAME

COPY . /home/$USERNAME/
WORKDIR /home/$USERNAME/

RUN pip install --upgrade pip
RUN pip install --upgrade setuptools

RUN python -m pip install -r requirements.txt

USER $USERNAME
CMD ["python", "main.py"]
main.py
from selenium import webdriver

user_profile = '/home/${USERNAME}/UserProfile' #USERNAMEは先程Dockerfileで指定した名前にしてください, dotenvを利用するのも可
options = webdriver.ChromeOptions()

options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument("--disable-setuid-sandbox")
options.add_argument('--user-data-dir=' + user_profile)

driver = webdriver.Chrome(options=options)

解説

 linuxの場合、dockerコンテナ内で作成・編集されるファイルはrootユーザーで作成されます。その権限がホストコンピュータにも影響するため、docker-compose up --buildする度に./UserProfile/ディレクトリに権限がなく、コピー出来ない旨のエラーが表示されます。

 これを回避するために、ホストコンピュータと同じUID/GIDを持ったユーザーを作成し、pythonファイルを実行することによってホストコンピュータで権限を持った状態の./UserProfile/が作成されます。

 注意点としては、pipを使用するまではrootユーザーでいることと、./UserProfile/フォルダをユーザーの権限のある場所(ユーザーフォルダの下)に作成することです。./UserProfile/フォルダを適切な位置に配置しなかった場合、
Python Selenium --user-data-dir option ERROR: could not remove old devtools port fileと怒られます。

備考

 もしかしたらホストコンピュータでidコマンドを実行した結果をそのまま渡したりなどが可能かもしれません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0