[에러] Docker & ChromeDriver path

nayoon·2021년 2월 8일
1

error

목록 보기
2/4

문제 상황

다음과 같은 에러가 발생하였다.

> sudo docker-compose up
Building with native build. Learn about native build in Compose here: https://docs.docker.com/go/compose-native-build/
Recreating boanbot ... done
Recreating boanbot_nginx_1 ... done
Attaching to boanbot, boanbot_nginx_1
boanbot  | [2021-02-08 02:26:08 +0000] [1] [INFO] Starting gunicorn 20.0.4
boanbot  | [2021-02-08 02:26:08 +0000] [1] [INFO] Listening at: http://0.0.0.0:8080 (1)
boanbot  | [2021-02-08 02:26:08 +0000] [1] [INFO] Using worker: sync
boanbot  | [2021-02-08 02:26:08 +0000] [8] [INFO] Booting worker with pid: 8
nginx_1  | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
nginx_1  | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
nginx_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
nginx_1  | 10-listen-on-ipv6-by-default.sh: info: /etc/nginx/conf.d/default.conf is not a file or does not exist
nginx_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
boanbot  |     raise child_exception_type(errno_num, err_msg, err_filename)
boanbot  | FileNotFoundError: [Errno 2] No such file or directory: '/home/ubuntu/chrome/chromedriver'
boanbot  |
boanbot  | During handling of the above exception, another exception occurred:
boanbot  |
boanbot  | Traceback (most recent call last):
boanbot  |   File "/usr/local/lib/python3.8/dist-packages/django/core/handlers/exception.py", line 47, in inner
boanbot  |     response = get_response(request)
boanbot  |   File "/usr/local/lib/python3.8/dist-packages/django/core/handlers/base.py", line 181, in _get_response
boanbot  |     response = wrapped_callback(request, *callback_args, **callback_kwargs)
boanbot  |   File "/usr/local/lib/python3.8/dist-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
boanbot  |     return view_func(*args, **kwargs)
boanbot  |   File "/srv/boanbot/news/views.py", line 17, in callApi
boanbot  |     response = kakaotemplates.keywords(client_utterance)
boanbot  |   File "/srv/boanbot/kakaotemplates.py", line 7, in keywords
boanbot  |     return basicCard(keyword, carousel=True)
boanbot  |   File "/srv/boanbot/kakaotemplates.py", line 11, in basicCard
boanbot  |     data = categorize.diverge(keyword)
boanbot  |   File "/srv/boanbot/categorize.py", line 28, in diverge
boanbot  |     data = crawling.query(keyword)
boanbot  |   File "/srv/boanbot/crawling.py", line 260, in query
boanbot  |     result.extend(dailysecu_query_news(parameter))
boanbot  |   File "/srv/boanbot/crawling.py", line 199, in dailysecu_query_news
boanbot  |     driver = webdriver.Chrome("/home/ubuntu/chrome/chromedriver", options=options)
boanbot  |   File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/chrome/webdriver.py", line 73, in __init__
boanbot  |     self.service.start()
boanbot  |   File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/common/service.py", line 81, in start
boanbot  |     raise WebDriverException(
boanbot  | selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home

chrome driver의 경로를 찾을 수 없다는 데, 분명 저 위치에 잘만 설치했는데, 왜 못 찾는지 이해를 할 수가 없었다.

문제 해결

내가 생각하지 못했던 부분은

도커에서 Selenium이 실행된다.

였다.

그러니까 도커에서 Selenium이 실행되기 때문에 당연히 외부에 설치되어있는 chromedriver를 읽어올 수 없었던 것이다.

그러므로 Chrome와 Chrome_driver를 설치하는 부분을 Dockerfile에 작성해줘야한다!

# Dockerfile
FROM ubuntu:latest

MAINTAINER nayoonkym@gmail.com

WORKDIR /srv/boanbot

RUN apt-get update

# PIP
RUN apt-get update
RUN apt-get install -y python3.8 python3-pip --fix-missing

# wgetRUN apt-get update && apt-get install -y wget && rm -rf /var/lib/apt/lists/*

ENV DEBIAN_FRONTEND=noninteractive

# 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/goodle.list'
RUN apt-get update
RUN apt-get install -y google-chrome-stable

# CHROME_DRIVER
RUN apt-get install -yqq unzip
RUN apt-get install -y curl
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/
ENV DISPLAY=:99

WORKDIR /srv/boanbot
COPY requirements.txt /srv/boanbot
RUN pip3 install -r requirements.txt

COPY . /srv/boanbot

이렇게 하고나서야 'chromedriver' executable needs to be in PATH. 문제를 해결할 수 있었다.

문제를 고쳤더니 또 문제..

nginx_1  | [08/Feb/2021:05:45:55 +0000] "POST /call/ HTTP/1.1" 499 0 "-" "AHC/2.1" "-"

499에러는 처음보는데, client error로 client closed request라고 한다.

해석하자면, nginx에서 발생하는 에러인데, 서버가 요청을 수행하는 도중에 클라이언트가 연결을 끊어버리는 경우라고 한다.

챗봇에서는 위의 에러가 발생했을 경우 아래와 같이 표시된다.

챗봇이 제공한 것은 '주간 핫 뉴스'에 대한 response이다. 즉, '미국'에 대한 response가 오지 않았따.

이유는 '미국'에 대한 데이터 정보를 수집해오는 시간이 너무 오래 걸리기 때문에 더 이상 response를 기다리지 않고 연결을 끊어버린 것이다.

'미국'에 대한 response를 하지 않는 것도 문제인데, 다음도 문제이다.

nginx_1  | [08/Feb/2021:06:14:07 +0000] "POST /call/ HTTP/1.1" 499 0 "-" "AHC/2.1" "-"
nginx_1  | [08/Feb/2021:06:14:08 +0000] "POST /call/ HTTP/1.1" 499 0 "-" "AHC/2.1" "-"

연달아 챗봇에게 request를 보냈더니 두 keyword 모두 499에러가 나고 request에 대한 response를 보낼 수 없었다.

아무래도 빠르게 데이터를 가져오는 식으로 바꿔야할 것 같다.

참고사이트:

nginx 499 에러:

profile
뚜벅뚜벅 열심히 공부하는 개발자

0개의 댓글