참고 링크

https://github.com/joyzoursky/docker-python-chromedriver/issues/30

Selenium Headless Scraping For Servers & Docker

셀레니움, 그리고 크롬드라이버는 도커 파일을 빌드할 때, 그 과정이 매우 복잡하다.

그렇기 때문에 selenium-grid 혹은 bs4를 사용하는 방향으로 항상 크롤링을 진행해왔지만, 너무 좋은 자료를 발견해서 이번 기회에 도커 파일을 만들어 시도하려 한다.

위에서 명시한 3.10 debian 버젼의 도커를 이용해 크롬 드라이버 셀레니움 전용 도커 파일을 만들어 크롤링을 진행해보고 있다

FROM python:3.10

WORKDIR /app

COPY . /app

# install google chrome
RUN wget -q -O - <https://dl-ssl.google.com/linux/linux_signing_key.pub> | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] <http://dl.google.com/linux/chrome/deb/> stable main" >> /etc/apt/sources.list.d/google-chrome.list'
RUN apt-get -y update
RUN apt-get install -y google-chrome-stable # 이 부분을 아래랑 교체하라는 말

# install chromedriver
RUN apt-get install -yqq unzip
RUN wget -O /tmp/chromedriver.zip <http://chromedriver.storage.googleapis.com/`curl> -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/ \\
     && rm /tmp/chromedriver.zip

# set display port to avoid crash
ENV DISPLAY=:99

RUN pip install --upgrade pip

RUN pip install --no-cache-dir --trusted-host pypi.python.org -r requirements.txt

I'm now using this workaround (using chromium instead of chrome) - works on M1!

apt-get install -y chromium

https://github.com/joyzoursky/docker-python-chromedriver/issues/30

멀티 프로세싱

도커 컨테이너 내부에서 멀티프로세싱은 기본적으로 가능합니다. 그러나, 멀티프로세싱을 사용할 때 특정 조건과 환경 설정에 따라 문제가 발생할 수 있으며, 이는 도커의 기본 설정이나 컨테이너의 리소스 제한, 호스트 시스템과의 상호작용 방식 등에 의해 영향을 받을 수 있습니다.

그래서 저는 멀티 프로세싱이 아닌 스레딩을 사용했습니다

PID 1 문제: 전통적인 운영 체제에서는 PID 1(프로세스 식별자 1)이 모든 자식 프로세스를 관리하고 좀비 프로세스(zombie process)를 회수합니다. 그러나 도커 컨테이너는 기본적으로 단일 프로세스를 실행하도록 설계되었기 때문에, 이러한 작업을 적절히 처리하지 않을 수 있습니다. 멀티프로세싱을 사용할 경우 좀비 프로세스가 남아있을 수 있습니다.

IPC Namespace: 도커는 프로세스 간 통신(IPC)을 위해 별도의 네임스페이스를 사용합니다. 멀티프로세싱은 이러한 IPC 메커니즘에 의존하는 경우가 많습니다. 따라서, 기본적으로 격리된 네임스페이스를 사용하는 도커 컨테이너는 이러한 메커니즘의 사용에 영향을 줄 수 있습니다.