슬기로운 개발자생활/DevOps

[Docker] python 경량화 + 빌드속도 최적화 이미지 (+ selenium 설정 추가) 240906 문제 해결 추가

개발자 소신 2024. 7. 6. 16:24
반응형

ㅁ 파일구조

폴더구조는 이렇게 가져가는게 Docker로 배포하기 편한듯

ㅁDockerfile

  • 3.9 버전 러버라 파이썬 쓸 떈 3.9 이미지를 주로 사용
  • 캐싱을 활용한 빌드속도 최적화
  • 셀레니움을 위한 크롬 설치

 

### 20240906 수정

 

Stable 버전인 128.0.6613.119-1 크롬 설치 후 셀레니움 실행 시 disconnected: not connected to DevTools 에러 발생

1. 윈도우에서 테스트해보니 에러메시지 [WinError 193] %1은(는) 올바른 Win32 응용 프로그램이 아닙니다

webdriver-manager가 THIRD_PARTY_NOTICES.chromedriver를 가져오는 것을 확인하여 수정해봄 -> 도커에서는 적용되지 않음.

2. 결국 특정 버전의 크롬을 설치하는 방식으로 해결

 

나중에도 크롬 버전 관련 이슈 발생 시 다음 링크에서 버전 확인 가능

# BUILDER ----------------------------------------------------------------
FROM        python:3.9-slim as builder

# 의존성 라이브러리 캐싱을 통한 빌드속도 최적화
COPY        requirements.txt .

RUN         pip install --upgrade pip \
                && pip install -r requirements.txt

# 크롬 버전 선택
ENV         CHROME_VERSION=127.0.6533.72-1

# 크롬 해당 버전 설치
RUN         apt-get update && apt-get install -y wget && \
                wget -q https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_${CHROME_VERSION}_amd64.deb && \
                apt-get -y update && \
                apt-get install -y ./google-chrome-stable_${CHROME_VERSION}_amd64.deb;

# selenium, webdriver-manager 의존성 추가
RUN         pip install selenium webdriver-manager;

COPY        . .

# RUNNING ----------------------------------------------------------------
FROM        python:3.9-slim

WORKDIR     /app

# 크롬 설치된 것 가져옴
COPY        --from=builder /opt/google/chrome /opt/google/chrome

# webdriver-manager를 위한 심볼릭 링크 연결, chrome 구동을 위한 필수 패키지들 설치
RUN         ln -s /opt/google/chrome/google-chrome /usr/bin/google-chrome && \
                apt-get update && \
                apt-get install -y --no-install-recommends libnspr4 libnss3 \
                libglib2.0-0 libdbus-1-3 libatk1.0-0 libatk-bridge2.0-0 \
                libcups2 libdrm2 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 \
                libgbm1 libgdk-pixbuf2.0-0 libx11-xcb1 xdg-utils libxkbcommon0 \ 
                libpango-1.0-0 libcairo2 libasound2 && \
                rm -rf /var/lib/apt/lists/* && \
                ldconfig; \
            fi

# 설치된 의존성 라이브러리 복사
COPY        --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
COPY        --from=builder /app /app

CMD         ["python", "main.py"]
  • ldconfig 명령어
    • 캐시 업데이트: ldconfig는 시스템이 새로운 라이브러리를 인식하고 빠르게 접근할 수 있도록 캐시를 업데이트합니다.
    • 심볼릭 링크 설정: 올바른 라이브러리 버전을 사용하도록 심볼릭 링크를 설정합니다.
    • 새로운 라이브러리 검색: 설치된 새로운 라이브러리를 시스템이 인식하고 사용할 수 있게 합니다.

reuquirements.txt

sosin

app/main.py

import asyncio

from sosin import VirtualDriver

async def main():
    vd = VirtualDriver()
    vd.set_argument(headless=True, linux=True)
    driver = vd.get_driver()
    driver.get('https://www.google.com')

# ---------------------------------------------------------------------------------------------
# Run main
if __name__ == '__main__':
    asyncio.run(main())
반응형