본문 바로가기

Spring

[Spring] 배포 서버의 도커 컨테이너에 크롤링 환경 구축하기

배포 서버의 도커 컨테이너에 크롤링 환경 구축하기

⚙️ 개발 환경

  • AWS Linux2 EC2
  • Java 17
  • Gradle
  • Spring boot

 

크롤링 소스코드는 여기서 확인할 수 있습니다.

현재 비공개 레포로 되어있어 추후에 다른 글로 정리해서 올리도록 하겠습니다.

 

📍 Dockerfile : 도커 컨테이너에 크롬 브라우저 및 크롬 드라이버 설치 후 배포

FROM openjdk:17.0.1-jdk-slim

RUN apt-get -y update

RUN apt -y install wget

RUN apt -y install unzip

RUN apt -y install curl

RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

RUN apt -y install ./google-chrome-stable_current_amd64.deb

RUN wget -O /tmp/chromedriver.zip https://chromedriver.storage.googleapis.com/` curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip

RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/bin

ARG JAR_FILE=/build/libs/sejongmate-0.0.1-SNAPSHOT.jar

COPY ${JAR_FILE} /sejongmate.jar

ENTRYPOINT ["java","-jar","-Dspring.profiles.active=prod", "/sejongmate.jar"]

해당 도커 파일을 이용해 배포한 서버에서 크롤링 하는 API를 호출한 결과 아래와 같이 성공적으로 호출하는 것을 확인할 수 있었다.

 

스크린샷 2023-04-30 오전 3 55 59

 

해당 API는 회원가입 API로, 자바 셀레니움을 이용해 블랙보드 로그인 후 학생 정보를 크롤링해 가져온 결과이다.



📍 Trouble shooting

#1 : 도커 컨테이너 내부 디렉토리 파일과 배포 서버 내부 디렉토리 파일은 다르다

로컬에서는 잘 돌아가는 크롤링 코드가, 도커 환경에서는 돌아가지 않았다. chrome driver를 찾을 수 없다는 이유에서였다.

 

분명히 서버 배포 환경에서 chrome driver를 다운받아 path 설정도 제대로 해놨는데, 아래처럼 파일을 찾을 수 없다는 오류가 계속 떠서 특정 디렉토리 내 파일을 모두 출력하는 코드를 다음과 같이 추가했다.

** path : user/bin

File dirFile = new File("usr/bin");
File[] fileList = dirFile.listFiles();
for(File file: fileList) {
    System.out.println(file.getName());
}

 

출력 결과를 확인해보니, 서버의 디렉토리에 있는 파일 목록과 다른 것을 알게되었다.

배포 서버 위에 도커 이미지를 올리고 이를 실행한 컨테이너가 있는 것이기 때문에, 컨테이너 내부 환경과 배포 서버의 환경은 다른 것이였다!

도커에 대한 이해가 부족했기 때문에 발생한 삽질이였다 ..

 

 

서버에 있는 파일을 컨테이너에 복사하기 위해서 아래의 명령어를 사용했다.

docker cp /usr/bin/chromedriver [컨테이너 이름]:/usr/bin/chromedriver 

이후 다시 실행해보니, 파일을 찾을 수 없다는 오류가 사라진 것을 확인할 수 있었다!

대신, 도커 컨테이너에 크롬 브라우저를 설치하지 않았기 때문에 오류가 발생했다. 해당 오류를 해결한 방법은 #2번에 적었다.



#2 : 도커 이미지의 OS를 잘 확인하고 명령어를 작성하자

도커 환경에서의 OS가 배포 서버의 OS와 일치한다고 막연히 생각하고 있었기에 처음에는 아래와 같이 Dockerfile을 작성하였다.

FROM openjdk:17-alpine

RUN sudo wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm

RUN sudo yum install google-chrome-stable_current_x86_64.rpm

RUN sudo RUN wget -O /tmp/chromedriver.zip https://chromedriver.storage.googleapis.com/ curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip

RUN sudo RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/bin

ARG JAR_FILE=/build/libs/sejongmate-0.0.1-SNAPSHOT.jar

COPY ${JAR_FILE} /sejongmate.jar

 

 

현재 배포 서버가 리눅스이기 때문에 yum 명령어를 이용해 스크립트를 작성하였는데, 빌드시 아래와 같이 yum을 찾을 수 없다는 오류가 났다.

/bin/sh: yum: not found
The command '/bin/sh -c yum install google-chrome-stable_current_x86_64.rpm' returned a non-zero code: 127

Error: Process completed with exit code 127.

 

 

알고보니 기존에 사용하던 도커 이미지는 openjdk:17-alpine 인데, 이는 알파인 리눅스 OS 였다.

때문에 알파인 리눅스에서 사용되는 apk 명령어 사용해서 다운로드를 진행해야 했다. apk 명령어는 install 대신 add를 사용하는데, add를 사용한 결과 아래와 같이 크롬 설치 패키지를 찾을 수 없다는 오류가 떴다.

ERROR: unable to select packages:
  google-chrome-stable_current_x86_64.rpm (no such package):
    required by: world[google-chrome-stable_current_x86_64.rpm]

서칭을 해봐도 이와 관련한 레퍼런스를 찾을 수 없었다..

아마 알파인 리눅스에서 크롬 브라우저를 다운할 수 없거나, 외부 패키지를 다운할 수 없는 것 같다.

 

이를 해결하기 위해 도커 이미지 자체를 debian 계열의 리눅스로 변경하고, apt 명령어를 사용해서 크롬 브라우저 및 드라이버를 다운 받았다.

사용한 도커 이미지는 openjdk:17.0.1-jdk-slim 이고, 도커 파일의 전체 코드는 가장 상단에서 확인할 수 있다.

 

위 문제들을 해결하기 위해 거의 하루를 꼬박써가면서 삽질한 것 같은데, 도커에 대한 이해 없이 도커로 서버를 배포하다보니 발생한 문제였던 것 같다. 덕분에 도커 컨테이너가 어떠한 방식으로 동작하는지 직접 부딪히며 배울 수 있었다!