개발

alpine linux puppeteer 실행 오류

syaku 2025. 1. 3. 17:10
728x90
반응형

원인 분석

발생하는 최초 위치

  • alpine linux 기반의 도커 컨테이너에서 puppeteer 실행 오류

세부적인 원인

  • puppeteer 의 필수 패키지 설치 누락
  • # 로그 오류 spawn /home/app/node_modules/puppeteer/.local-chromium/linux-494755/chrome-linux/chrome ENOENT
  • puppeteer 에서 설치한 크롬 버전이 리눅스 환경에서 작동하지 않음
  • # 로그 오류 Error loading shared library libudev.so.1: No such file or directory (needed by /root/.cache/puppeteer/chrome/linux-131.0.6778.204/chrome-linux64/chrome) 2025-01-03 16:24:21 web-crawler:start: Error relocating /root/.cache/puppeteer/chrome/linux-131.0.6778.204/chrome-linux64/chrome: posix_fallocate64: symbol not found
  • puppeteer 에서 크롬 설치를 하지 않고 직접 크롬 설치하면 버전 호환성 오류
  • # 로그 오류 puppeteerOptions {executablePath: '/usr/bin/chromium-browser',headless: true,args: ['--no-sandbox','--disable-setuid-sandbox','--disable-dev-shm-usage']} 2025-01-02 20:43:22 web-crawler:start: Crawling failed: Error: Failed to launch browser: Could not find Chrome (ver. 131.0.6778.204). This can occur if either

문제 해결

puppeteer 를 사용하기 위한 필수 패키지 설치 누락 오류

패키지 설치

apk update && apk upgrade && \
    apk add --no-cache \
    nss \
    freetype \
    freetype-dev \
    harfbuzz \
    ca-certificates \
    ttf-freefont \
    nodejs \
    npm \
    font-liberation \
    alsa-lib \
    at-spi2-core \
    atkmm2.36 \
    libc6-compat \
    cairo \
    cups-libs \
    dbus-libs \
    expat \
    fontconfig \
    mesa-gbm \
    libgcc \
    glib \
    gtk+3.0 \
    nspr \
    nss \
    pango \
    libstdc++ \
    libx11 \
    libxcb \
    libxcomposite \
    libxcursor \
    libxdamage \
    libxext \
    libxfixes \
    libxi \
    libxrandr \
    libxrender \
    libxscrnsaver \
    libxtst \
    wget \
    xdg-utils

alpine linux 에서 puppeteer 에서 설치된 크롬 사용 하지 못함

직접 크롬 설치

apk add --no-cache \
    chromium \
    chromium-chromedriver \

# Puppeteer cache 관련 디렉토리 및 권한 설정
mkdir -p /root/.cache/puppeteer && \ chmod -R 777 /root/.cache/puppeteer

# Puppeteer 환경 변수 설정
export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
export PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium
export PUPPETEER_CACHE_DIR=/root/.cache/puppeteer

puppeteer 런처 옵션 추가

await puppeteer.launch({
    executablePath: '/usr/bin/chromium', // process.env.PUPPETEER_EXECUTABLE_PATH
    cacheDirectory: '/root/.cache/puppeteer', // process.env.PUPPETEER_CACHE_DIR
});

puppeteer 에서 크롬 설치를 하지 않고 직접 크롬을 설치하면 버전 호환성 오류

크롬 버전 확인 puppeteer version 확인은 package-lock.json 에서 확인할 수 있다.

# 설치된 크롬 버전 확인
$ chromium --version

puppeteer 는 23.11.1 고정 버전을 사용하면 크롬 버전 131.0.6778.204 설치하면 호환된다.

# npm 설치 패키지
puppeteer@23.11.1

# alpine 설치 패키지
chromium=131.0.6778.204-r0

alpine 에서 직접 크롬 설치

$ echo "http://dl-cdn.alpinelinux.org/alpine/edge/main" >> /etc/apk/repositories && \
echo "http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories

$ apk add --no-cache chromium=131.0.6778.204-r0

도커를 사용하면 puppeteer 런처 실행시 옵션 추가 필요

await puppeteer.launch({
    executablePath: '/usr/bin/chromium', // process.env.PUPPETEER_EXECUTABLE_PATH
    cacheDirectory: '/root/.cache/puppeteer', // process.env.PUPPETEER_CACHE_DIR
    args: ["--no-sandbox","--disable-setuid-sandbox","--disable-dev-shm-usage", "--disable-gpu"]
});

옵션 설명

  1. 컨테이너 환경 최적화:
    • -no-sandbox, -disable-setuid-sandbox, -disable-dev-shm-usage는 Docker와 같은 컨테이너 환경에서 안정적인 브라우저 실행을 보장합니다.
  2. 리소스 절약 및 호환성 개선:
    • -disable-gpu, -disable-software-rasterizer는 GPU가 없는 환경에서 성능 문제를 방지합니다.
  3. 불필요한 기능 제거:
    • -disable-extensions, -hide-scrollbars, -mute-audio는 테스트나 크롤링 작업 중 불필요한 리소스 소비를 줄입니다.
728x90
반응형