Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[bug] ChromeDriver 관련 에러 #944

Closed
sangwonsheep opened this issue Jan 9, 2025 · 1 comment
Closed

[bug] ChromeDriver 관련 에러 #944

sangwonsheep opened this issue Jan 9, 2025 · 1 comment
Assignees
Labels
backend 백엔드 관련 bug 🐛 에러, 버그, 수정해야 할 사항들

Comments

@sangwonsheep
Copy link
Collaborator

sangwonsheep commented Jan 9, 2025

Describe the bug

처음에 batch 관련 jar 이미지 1개, chrome 관련 이미지 1개를 생성해둔 상태이다.
selenium 이미지를 만들어 두고 어디서도 사용하지 않고, 생성만 된 상태였다.
batch에서 selenium을 사용해야 하는데 Chrome, ChromeDriver가 설치되어 있지 않아 계속해서 에러가 발생했었다.

  • 크롬 이미지
FROM openjdk:17-jdk-slim-buster

# 시스템 패키지 업데이트 및 설치
RUN apt-get update -y && \
    apt-get install -y wget unzip curl xvfb

# 영어로 언어 설정 - 셀레니움을 위해서
ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US:en
ENV LC_ALL=en_US.UTF-8

# Google Chrome 설치
RUN wget https://chrome-versions.com/google-chrome-stable-114.0.5735.106-1.deb && \
    apt-get install -y ./google-chrome-stable-114.0.5735.106-1.deb && \
    rm -f ./google-chrome-stable-114.0.5735.106-1.deb && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Chromedriver 설치
RUN wget -O /tmp/chromedriver.zip https://chromedriver.storage.googleapis.com/114/chromedriver_linux64.zip && \
    unzip /tmp/chromedriver.zip -d /usr/local/bin/ && \
    rm -f /tmp/chromedriver.zip && \

# Xvfb 설정
RUN Xvfb :99 -ac &
ENV DISPLAY=:99

문제 상황

Possible causes are invalid address of the remote server or browser start-up failure.

2025-01-09 11:21:28.969 DEBUG 1 --- [ntContainer#1-1] i.g.bonigarcia.wdm.WebDriverManager      : Driver chromedriver 131.0.6778.264 found in cache
2025-01-09 11:21:28.970  INFO 1 --- [ntContainer#1-1] i.g.bonigarcia.wdm.WebDriverManager      : Exporting webdriver.chrome.driver as /root/.cache/selenium/chromedriver/linux64/131.0.6778.264/chromedriver
2025-01-09 11:21:28.973  INFO 1 --- [ntContainer#1-1] b.b.d.link.service.LinkCrawlingService   : OG Tag Selenium으로 업데이트 :

org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Possible causes are invalid address of the remote server or browser start-up failure.
Host info: host: '', ip: ''
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:536)
	at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:232)
	at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:161)
	at org.openqa.selenium.chromium.ChromiumDriver.<init>(ChromiumDriver.java:114)
	at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:89)
	at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:84)
	at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:73)

Driver server process died prematurely

Caused by: org.openqa.selenium.WebDriverException: Driver server process died prematurely.
Build info: version: '4.19.1', revision: 'abe0ee07dc'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '6.8.0-47-generic', java.version: '17.0.13'
Driver info: driver.version: ChromeDriver
	at org.openqa.selenium.remote.service.DriverService.start(DriverService.java:246)
	at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:117)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:518)
	... 52 common frames omitted

여기서 문제는 ChromeDriver 버전을 114로 지정했었는데 131을 캐시에서 찾는다는 것이다.
Chrome과 ChromeDriver의 버전이 맞지 않는 것을 확인했고, 내가 이미지로 올렸던 ChromeDriver를 인식못하는 것 같다.
위에서 한 방식이 잘못된 것을 깨닫고, 다른 방식을 찾게 되었다.

해결 시도

batch 컨테이너에서 batch, chrome 이미지까지 같이 사용해야만 ChromeDriver를 사용해서 Selenium이 동작할 수 있는 것이다.
이건 어떻게 구현해야 할까?
chrome 이미지를 베이스 이미지로 두고, batch 도커 파일에서 베이스 이미지를 받아서 빌드하는 방식으로 구현을 도전!

이미 크롬 이미지는 있으니까 batch 이미지를 만들 때 이걸 가져다 사용하면 된다.

FROM chrome-base:latest // 예시로 지은 크롬 이미지 이름

LABEL authors="Baguni"

# JAR 파일 복사
ARG JAR_FILE=build/libs/*.jar
WORKDIR /app
COPY ${JAR_FILE} /app/baguni-batch.jar

# 애플리케이션 포트 열기
EXPOSE 8080

# 애플리케이션 실행
ENTRYPOINT ["java", "-Dfile.encoding=UTF-8", "-jar", "-Duser.timezone=Asia/Seoul", "/app/baguni-batch.jar"]

docker.io/library/chrome-base:latest: pull access denied

--------------------
   1 |     # chrome, chromedriver image 사용
   2 | >>> FROM chrome-base
   3 |     
   4 |     LABEL authors="Baguni"
--------------------
ERROR: failed to solve: chrome-base: failed to resolve source metadata for docker.io/library/chrome-base:latest: pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
Error: Process completed with exit code 1.

해결 시도 1

github actions를 실행했을 때 위와 같은 에러가 발생했다.
그 이유는 무엇일까? 우리가 작성한 해당 이미지를 docker hub에 있는 repository에서 가져오지 못한다는 것이었다.
즉, 나는 docker hub에 이미지를 올리지도 않고 서버에만 만들어 둔 것 이었다.

1. docker login
2. docker image tag chrome-base:latest minkyeu/baguni:chrome-selenium // chrome-base:latest -> minkyeu/baguni:chrome-selenium로 변경
3. docker push minkyeu/baguni:chrome-selenium // minkyeu/baguni에 이미지 push

위 3단계를 진행하여 docker hub에 업로드 하였다.

해결 시도 2

위에서 시도한 방법대로 했음에도 불구하고 동일한 에러가 발생했다.
다시 생각해보면, docker hub의 private repository에 해당 이미지를 올렸던 것이다.
docker login을 하지 않고, 해당 이미지를 가져다 쓰려고 하니까 못가져오는 것이었다.

방법은 두 가지다.
docker login을 먼저 하거나 chrome 이미지를 public repository에 올리는 것이다.
어차피 chrome 이미지는 노출되어도 상관 없으니까 public에 올리는 것으로 결정했다.

이 방법을 이용했더니 github actions 제대로 동작하고, 서버까지 제대로 뜨는 것을 확인할 수 있었다.


문제 상황

Message unknown error: DevToolsActivePort file doesn't exist

org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Response code 500. Message: unknown error: Chrome failed to start: exited abnormally.
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
Host info: host: '', ip: ''
Build info: version: '4.19.1', revision: 'abe0ee07dc'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '6.8.0-47-generic', java.version: '17.0.2'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Command: [null, newSession {capabilities=[Capabilities {browserName: chrome, goog:chromeOptions: {args: [--headless, --user-agent=facebookextern..., --start-maximized, --disable-popup-blocking, --remote-allow-origins=*], extensions: []}}]}]

위의 문제를 모두 해결하고, Selenium을 동작시켰더니 이번엔 다른 에러가 발생한 것이다.
에러가 달라져서 오히려 다행이었다.. 앞에서 했던 방법들이 다 맞았다는 것이라는 것이 증명된 것이다.

해결 시도

1. Selenium 옵션 추가

  • 기존 옵션
options.addArguments("--headless"); // 브라우저 UI 없이 백그라운드로 동작options.addArguments("--user-agent=" +openGraphOption.getUserAgent());
options.addArguments("--no-sandbox");
options.addArguments("--single-process");
options.addArguments("--start-maximized");
options.addArguments("--disable-popup-blocking"); // 팝업 안뜨게
options.addArguments("--remote-allow-origins=*"); // 모든 출처에서의 연결을 허용, 자동화된 테스트나 CORS 제한을 우회할 때 유용
options.addArguments("--disable-dev-shm-usage"); // Chrome이 /dev/shm 대신 /tmp 디렉토리를 사용, /tmp는 일반적인 파일 시스템으로, 크기 제한이 없어 메모리 부족 문제를 방지
options.addArguments("--remote-debugging-port=9222");
  • 추가된 옵션
options.addArguments("--no-sandbox"); // Chrome의 샌드박스 보안 기능을 비활성화
options.addArguments("--single-process");
options.addArguments("--disable-dev-shm-usage"); // Chrome이 /dev/shm 대신 /tmp 디렉토리를 사용, /tmp는 일반적인 파일 시스템으로, 크기 제한이 없어 메모리 부족 문제를 방지
options.addArguments("--remote-debugging-port=9222");

위 옵션들을 다 추가했는데도 문제가 해결되지 않음.

  • no sandbox : Docker 컨테이너처럼 제한된 권한 환경에서는 Chrome의 샌드박스가 충돌을 일으킬 수 있기 때문에 사용
  • single process : Docker 환경에서 성능 문제를 줄이기 위해 Chrome을 단일 프로세스로 실행
  • disable dev shm usage : 공유 메모리(/dev/shm)을 사용하지 않고 /tmp 디렉토리를 사용하도록 강제, 메모리 부족 문제를 방지하기 위함
  • remote debugging port : Chrome에서 원격 디버깅을 활성화하고, 디버깅 포트를 설정

그렇다는 것은 필요한 옵션이 있었을 수는 있지만, 다른 문제일 가능성이 높다는 것

2. Chrome, ChromeDriver 버전 완전히 일치

 # Google Chrome 설치
RUN wget https://chrome-versions.com/google-chrome-stable-114.0.5735.106-1.deb && \
    apt-get install -y ./google-chrome-stable-114.0.5735.106-1.deb && \
    rm -f ./google-chrome-stable-114.0.5735.106-1.deb && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Chromedriver 설치
RUN wget -O /tmp/chromedriver.zip https://chromedriver.storage.googleapis.com/114.0.5735.106/chromedriver_linux64.zip && \
    unzip /tmp/chromedriver.zip -d /usr/local/bin/ && \
    rm -f /tmp/chromedriver.zip && \

이전 이미지는 https://chromedriver.storage.googleapis.com/114/chromedriver_linux64.zip 114 버전으로 설정했었다.
ChromeDriver 114 버전으로 설정했더니 버전이 Chrome과 114.0.5735까지만 같고 버전이 완전히 일치하지 않았다.
Chrome, ChromeDriver 버전을 완전히 일치(114.0.5735.106)시키게 되면서 문제가 해결되었다.

3. 불필요한 옵션 제거 후에도 제대로 동작하나?

options.addArguments("--single-process");
options.addArguments("--remote-debugging-port=9222");

두 옵션 제거 후에도 제대로 동작하는 것을 확인
결과적으로 Chrome, ChromeDriver의 버전이 제대로 맞지 않아서 발생했던 문제라고 생각함.

@sangwonsheep sangwonsheep added bug 🐛 에러, 버그, 수정해야 할 사항들 backend 백엔드 관련 labels Jan 9, 2025
@sangwonsheep sangwonsheep self-assigned this Jan 9, 2025
@kimminkyeu
Copy link
Collaborator

크롬 드라이버 부분은 이슈 해결되어 닫겠습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend 백엔드 관련 bug 🐛 에러, 버그, 수정해야 할 사항들
Projects
None yet
Development

No branches or pull requests

2 participants