使用 puppeteer 的 nodejs 項(xiàng)目發(fā)布到 Docker 中

1、Dockerfile文件

# 第一階段:構(gòu)建環(huán)境
FROM node:18 AS builder

# 設(shè)置工作目錄
WORKDIR /app

# 復(fù)制 package.json 和 package-lock.json
COPY package*.json ./

# 安裝依賴
RUN npm install && \
    npm cache clean --force

# 復(fù)制項(xiàng)目文件(包括 .puppeteerrc.cjs)
COPY . .

# 創(chuàng)建緩存目錄并設(shè)置權(quán)限
RUN mkdir -p /app/.cache/puppeteer && chmod -R 777 /app/.cache

# 第二階段:運(yùn)行環(huán)境
FROM node:18

# 設(shè)置環(huán)境變量
ENV LANG=en_US.UTF-8
ENV PPTRUSER_UID=10042
ENV PUPPETEER_CACHE_DIR=/home/pptruser/.cache/puppeteer
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true

# 安裝字體和系統(tǒng)依賴
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
    fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-khmeros \
    fonts-kacst fonts-freefont-ttf \
    fonts-font-awesome \
    fonts-noto-color-emoji \
    dbus dbus-x11 \
    libnss3 \
    libatk1.0-0 \
    libatk-bridge2.0-0 \
    libdrm2 \
    libxkbcommon0 \
    libxcomposite1 \
    libxdamage1 \
    libxrandr2 \
    libgbm1 \
    libasound2 \
    libatspi2.0-0 \
    libxshmfence1 \
    libx11-xcb1 \
    libglib2.0-0 \
    libgtk-3-0 \
    libcups2 \
    libxcb-dri3-0 \
    libxtst6 \
    libxss1 \
    libpci3 \
    libpango-1.0-0 \
    libcairo2 \
    libgdk-pixbuf2.0-0 \
    libfreetype6 \
    libharfbuzz0b \
    libfontconfig1 \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# 創(chuàng)建非 root 用戶
RUN groupadd -r pptruser && useradd -u $PPTRUSER_UID -rm -g pptruser -G audio,video pptruser

# 設(shè)置工作目錄
WORKDIR /app

# 從構(gòu)建環(huán)境復(fù)制依賴和項(xiàng)目文件
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app .

# 創(chuàng)建輸出目錄并設(shè)置權(quán)限
RUN mkdir -p /app/output && chmod -R 777 /app/output
RUN chown -R pptruser:pptruser /app/output

# 安裝 Chromium
RUN npx puppeteer browsers install chrome

# 設(shè)置緩存目錄權(quán)限
RUN mkdir -p $PUPPETEER_CACHE_DIR && chown -R pptruser:pptruser $PUPPETEER_CACHE_DIR

# 切換到非 root 用戶
USER pptruser

# 暴露端口
EXPOSE 3000

# 啟動(dòng)應(yīng)用
CMD ["node", "app.js"]

2、項(xiàng)目根目錄下創(chuàng)建 puppeteerrc.cjs

const { join } = require('path');

/**
 * @type {import("puppeteer").Configuration}
 */
module.exports = {
  // 將 Puppeteer 的緩存目錄更改為項(xiàng)目目錄下的 .cache/puppeteer
  cacheDirectory: join(__dirname, '.cache', 'puppeteer'),
};

3、使用 puppeteer

const puppeteer = require('puppeteer');

let browser;

const initBrowser = async () => {
    if (!browser) {

        const executablePath = puppeteer.executablePath();
        console.log('Executable Path:', executablePath);

        browser = await puppeteer.launch({
            executablePath: executablePath,
            args: ['--no-sandbox', '--disable-setuid-sandbox']
          });
    }
    return browser;
};

const closeBrowser = async () => {
    if (browser) {
        await browser.close();
        browser = null;
    }
};

module.exports = {
    initBrowser,
    closeBrowser,
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 Google Play應(yīng)用市場(chǎng)對(duì)于應(yīng)用的targetSdkVersion有了更為嚴(yán)格的要求。從 2018 年...
    申國(guó)駿閱讀 66,226評(píng)論 15 98
  • """1.個(gè)性化消息: 將用戶的姓名存到一個(gè)變量中,并向該用戶顯示一條消息。顯示的消息應(yīng)非常簡(jiǎn)單,如“Hello ...
    她即我命閱讀 5,868評(píng)論 0 6
  • 我們都是軟弱的人,所以才會(huì)說(shuō)謊。我們都是膽小的人,所以才要武裝。我們都是一群笨蛋,所以才會(huì)互相傷害。
    所羅門的偽證_dc0a閱讀 3,944評(píng)論 1 3
  • 為了讓我有一個(gè)更快速、更精彩、更輝煌的成長(zhǎng),我將開始這段刻骨銘心的自我蛻變之旅!從今天開始,我將每天堅(jiān)持閱...
    李薇帆閱讀 2,282評(píng)論 1 4
  • 似乎最近一直都在路上,每次出來(lái)走的時(shí)候感受都會(huì)很不一樣。 1、感恩一直遇到好心人,很幸運(yùn)。在路上總是...
    時(shí)間里的花Lily閱讀 1,791評(píng)論 1 3

友情鏈接更多精彩內(nèi)容