前置き
こんにちは。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"]
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
コマンドを実行した結果をそのまま渡したりなどが可能かもしれません。