슬기로운 개발자생활/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())
반응형