Mac M1환경에서 Docker Linux를 통해서 정상적으로 수집이 되는지를 테스트한다
Python으로 테스트를 진행하고자 하였다. 버전은 3.8로 진행이 되며 일단 Python3.8버전이 설치가 되어야 한다.
저장소에서 제공하는 Python 버전중에서 3.8이 없었다. 직접 소스를 빌드 하여야 한다.
apt update
apt -y install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev curl libbz2-dev
curl -O https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tar.xz
tar -xf Python-3.8.2.tar.xz
cd Python-3.8.2
./configure --enable-optimizations --disable-ipv6
make -j $(nproc)
make altinstall
ln -s /usr/local/bin/python3.8 /usr/bin/python
ln -s /usr/local/bin/pip3.8 /usr/bin/pip
메모리 문제인지 make 단계에서 간헐적 예외가 발생한다. 동일한 작업을 3 ~ 4회정도 반복하면 빌드가 되긴 한다. 이말은 Dockerfile
로 작성시 예외가 일어나 이미지 빌드가 안되는 단점이 존재한다.
8 버전이므로 7에서 제공하는 저장소를 등록만 해주면 7과 동일하게 사용이 가능하다. Python3.8버전을 저장소에서 제공한다.
# Repository set
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-Linux-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-Linux-*
# Korean pack
RUN dnf install glibc-langpack-ko -y
RUN echo "LANG=ko_KR.utf8" >> ~/.bash_profile
Python은 정상적으로 설치가 되나, Selenium을 사용하기 위한 크롬의 설치가 제대로 이루어지지 않았다.
google-chrome --version
명령어 입력시 행이 걸리면서 수행이 되질 않는다.google-chrome --headless --no-sandbox
명령어 입력시 여러 예외가 발생한다.두개의 OS 모두 하나씩 단점이 존재하였고, Python 빌드시 문제가 발생하여 Dockerfile
을 구성하는데 문제가 발생하는 Debian말고
CentOS를 선택한다.
크로미움 이라는 오픈소스 프로젝트에서 만든 브라우저 이름이 바로 크로미움이다. 크롬의 부모격으로 Linux - Unix의 관계로 생각해도 될 듯 하다.
크롬과 코드도 같은 코드를 사용하고 UI도 비슷하여 거의 유사하다.
단, 실제 코드 테스트시 크롬에서는 발생하지 않던 코드 예외가 간간히 발생하는 문제가 있어 코드 예외처리를 보안해야 한다.
크로니움의 경우도 기본 저장소에는 존재하지 않는다. EPEL(Extra Packages for Enterprise Linux)
를 설치하여 저장소를 추가하도록 한다.
EPEL는 Fedora 프로젝트에서 유지 관리하는 소프트웨어 패키지 저장소이며 RedHat 계열 OS는 사용이 가능하다.
Docker 환경에서 User를 만들지 않고 root 기준으로 한다
yum install -y epel-release
yum install -y chromium
yum install -y chromedriver
ln -s /usr/bin/chromium-browser /usr/bin/chromium
chromium --version
# Chromium 126.0.6478.182 Fedora Project
yum install -y python38
# Symbolick link
ln -s /usr/bin/python3.8 /usr/bin/python
ln -s /usr/bin/pip3 /usr/bin/pip
pip install --upgrade pip
pip install jupyter jupyterlab python-language-server
pip install selenium webdriver_manager
"""
normal: 페이지 로딩이 완료되고 onload 이벤트가 발생할 때까지 기다립니다. 이것은 Selenium의 기본 동작입니다.
eager: 페이지의 초기 HTML이 완전히 받아지고 DOM이 구성되면 바로 진행합니다. onload 이벤트가 발생하기를 기다리지 않습니다.
none: 명령이 바로 반환되고, 어떠한 기다림도 발생하지 않습니다.
"""
# 페이지 로딩 전략을 'normal'로 설정 (기본값이며 대부분의 리소스가 로드될 때까지 기다림)
caps = DesiredCapabilities().CHROME
caps["pageLoadStrategy"] = "normal" # "normal", "eager", "none"
# Chrome 옵션 설정
chrome_options = Options()
chrome_options.add_argument("--headless") # GUI 없이 실행
chrome_options.add_argument("--disable-gpu") # GPU 가속 사용 안 함
chrome_options.add_argument("--no-sandbox") # Sandbox 프로세스 사용하지 않음
chrome_options.add_argument("--disable-dev-shm-usage") # 이 옵션은 /dev/shm (공유 메모리 디렉토리)의 용량 제한과 관련된 문제를 해결하기 위해 사용됩니다. /dev/shm는 리눅스 시스템에서 임시 파일을 저장하는 데 사용되는 메모리 기반 파일 시스템입니다.
chrome_options.binary_location = '/usr/bin/chromium' # Chromium 실행 파일 경로
# ChromeDriver 서비스 개체 초기화
service = Service(executable_path='/usr/bin/chromedriver')
# Chrome driver
webdriver_client = webdriver.Chrome(service=service, options=chrome_options)
# OpenAI Client setting
os.environ["OPENAI_API_KEY"] = '[OPENAI_KEY]'
openai.api_key = os.environ["OPENAI_API_KEY"]
openai_client = openai.OpenAI()
# Elasticsearch Client setting
elastic_client = Elasticsearch(hosts='http://[ID]:[PASSWORD]@[IP]:9200')
webdriver_client
# <selenium.webdriver.chrome.webdriver.WebDriver (session="f87cae70088c7137e53e5c0f2f212577")>