Quay lại blog

Cách Chạy Puppeteer trong Docker Mà Không Gửi Chrome Trong Ứng Dụng Của Bạn

Michael Lee
Michael Lee

Expert Network Defense Engineer

20-Aug-2026

TL;DR:

  • Triển khai Puppeteer Docker thất bại khi gói Node, tệp thực thi Chrome và môi trường Linux được coi là một phụ thuộc vô hình. Làm cho mỗi ranh giới trở nên rõ ràng.
  • Hình ảnh chính thức là cơ sở hoàn chỉnh nhanh nhất. Nó đóng gói Puppeteer, Chrome để kiểm tra và các thư viện cần thiết dưới một nhãn phát hành đã biết.
  • Hình ảnh Chrome hệ thống cho bạn quyền kiểm soát hệ điều hành nhưng làm cho việc cài đặt và tương thích Chrome trở thành trách nhiệm của bạn. Ghim cả hai bên và chạy một kiểm tra khói khởi động trong quá trình xây dựng.
  • puppeteer-core chứa khách hàng mà không cần tải Chrome. Ghép đôi nó với một trình duyệt hoạt động riêng biệt khi hình ảnh ứng dụng nên giữ cho không có trình duyệt.
  • Scrapeless Scraping Browser cho phép ứng dụng kết nối với một trình duyệt đám mây được quản lý. Vòng đời Chrome, phụ thuộc trình duyệt và lối ra trình duyệt đều rời khỏi hình ảnh Node.js.
  • Miễn phí để bắt đầu. Những tài khoản Scrapeless mới bao gồm thời gian chạy Scraping Browser miễn phí — đăng ký tại app.scrapeless.com.

Giới thiệu: Puppeteer Cần một Hợp đồng Trình duyệt

npm install puppeteer không phải là toàn bộ việc triển khai. Puppeteer cũng cần một tệp thực thi Chrome tương thích, thư viện chung Linux, phông chữ, một thư mục hồ sơ có thể ghi, đủ bộ nhớ và một mô hình quy trình có thể đóng các quy trình con một cách sạch sẽ.

Docker chỉ làm cho những phụ thuộc đó có thể tái tạo khi chúng được ghi lại. Một hình ảnh chính thức ghi chúng lại cho bạn. Một hình ảnh tùy chỉnh chuyển hợp đồng vào Dockerfile của bạn. Một thiết kế trình duyệt từ xa giữ hợp đồng bên ngoài hình ảnh ứng dụng và để puppeteer-core làm khách.

Hướng dẫn này sử dụng Puppeteer Core 25.8.0 và Scrapeless SDK 1.11.0, cả hai đều được cài đặt trong quá trình xác minh. Gói cục bộ khởi động một tệp thực thi Chrome được cung cấp ngoài gói npm của nó và trả về tiêu đề trang như mong đợi.

Tại sao Puppeteer Cần Nhiều Hơn npm Install trong Docker

Puppeteer và Puppeteer Core giải quyết các vấn đề đóng gói khác nhau.

Gói Tải xuống trình duyệt Mục đích sử dụng
puppeteer Quản lý một Chrome tương thích để kiểm tra trong quá trình cài đặt Khởi động cục bộ hoặc trong container với trình duyệt đi kèm
puppeteer-core Không tải xuống một trình duyệt Kết nối với một tệp thực thi hiện có hoặc điểm cuối trình duyệt từ xa

Lựa chọn gói không cấu hình PID 1, bộ nhớ chung, sandbox trình duyệt, phông chữ, chứng chỉ hoặc giới hạn tài nguyên container. Những thứ đó vẫn là trách nhiệm của việc triển khai.

Điều kiện tiên quyết

  • Node.js 20 cho container ứng dụng.
  • Docker cho các mẫu hình ảnh chính thức và hệ thống-Chrome.
  • Puppeteer Core 25.8.0 cho mẫu ứng dụng không có trình duyệt.
  • Một tài khoản Scrapeless và khóa API cho trình duyệt đám mây được quản lý.
  • Một mục tiêu công khai hoặc được ủy quyền rõ ràng.

Ghi chú: Docker không khả dụng trong môi trường xác minh, vì vậy các lệnh xây dựng hình ảnh và docker run được gán nhãn là những khoảng trống điều kiện tiên quyết. Puppeteer Core 25.8.0 đã được cài đặt và khởi động chống lại một tệp thực thi Chrome bên ngoài gói; SDK Scrapeless đã được tải và làm cho chức năng kết nối Puppeteer của nó, nhưng không có khóa nào có sẵn cho một phiên đám mây.

Tùy chọn 1 — Bắt đầu từ Hình ảnh Puppeteer Chính thức

Hình ảnh chính thức bao gồm Chrome để Kiểm tra, các phụ thuộc hệ thống của nó và một phiên bản Puppeteer tương ứng. hướng dẫn Puppeteer Docker tài liệu hình ảnh và các yêu cầu thời gian chạy liên quan đến sandbox của nó.

Ghim hình ảnh thay vì sử dụng latest:

dockerfile Copy
FROM ghcr.io/puppeteer/puppeteer:25.8.0

WORKDIR /home/pptruser/app
COPY --chown=pptruser:pptruser package.json package-lock.json ./
RUN npm ci
COPY --chown=pptruser:pptruser . .

CMD ["node", "capture.mjs"]

Hình ảnh tài liệu chạy Chrome với sandbox của nó, vì vậy thời gian chạy container phải cung cấp khả năng cần thiết. Nó cũng cần một quy trình khởi tạo để quản lý trẻ em của trình duyệt:

bash Copy
docker build -t puppeteer-job:25.8.0 .
docker run --rm --init --cap-add=SYS_ADMIN puppeteer-job:25.8.0

Cấp quyền chỉ sau khi xem xét khối lượng công việc và thời gian chạy. hướng dẫn bảo mật container NIST phân tách rủi ro hình ảnh, rủi ro đăng ký, các điều khiển phối hợp, các điều khiển thời gian chạy và các điều khiển máy chủ.

Tùy chọn 2 — Tự cài đặt Chrome Hệ thống

Một hình ảnh hệ thống-Chrome tùy chỉnh là phù hợp khi tổ chức đã quản lý một kho trình duyệt, chuỗi chứng chỉ, phông chữ hoặc hình ảnh cơ sở.

Ứng dụng phải chỉ định Puppeteer Core về tệp thực thi đã cài đặt:

javascript Copy
import puppeteer from "puppeteer-core";

const browser = await puppeteer.launch({
  executablePath: process.env.PUPPETEER_EXECUTABLE_PATH,
  headless: true,
});

const page = await browser.newPage();
await page.setContent("<title>Chrome outside the npm package</title>");
console.log(await page.title());
await browser.close();

Xác minh thực hiện sử dụng một tệp thực thi Chrome bên ngoài và in Chrome outside the npm package. Điều đó xác nhận puppeteer-core không cần phải vận chuyển trình duyệt mà nó kiểm soát.

Dockerfile của bạn giờ đây sở hữu việc cài đặt và tương thích Chrome. Ghim gói trình duyệt, đảm bảo phiên bản của nó trong quá trình xây dựng hình ảnh, và chạy kịch bản khởi động trước khi xuất bản hình ảnh.

Năm Lỗi Container cần Chẩn đoán Từ Riêng

Các lỗi container Puppeteer trở nên dễ giải quyết hơn khi lỗi được ánh xạ tới một ranh giới.

Lỗi Bằng chứng cần kiểm tra Sửa chữa
Thiếu tệp thực thi executablePath và danh sách gói hình ảnh Cài đặt Chrome hoặc kết nối với trình duyệt từ xa
Thư viện chia sẻ bị thiếu Kiểm tra stderr của trình duyệt và thư viện liên kết Thêm phụ thuộc hệ điều hành cụ thể
Lỗi khởi động Sandbox Chính sách người dùng, kernel và khả năng container Khôi phục hợp đồng sandbox không root được hỗ trợ
Trình diễn đóng dưới tải Bộ nhớ, IPC và cấu hình /dev/shm Đặt tài nguyên container rõ ràng và bộ nhớ chia sẻ
Các tiến trình con còn lại PID 1 và xử lý tín hiệu tắt máy Sử dụng --init và đóng trình duyệt trong finally

Các không gian tên Linux cô lập các cái nhìn tiến trình, gắn kết, người dùng và tài nguyên mạng. tài liệu hướng dẫn không gian tên Linux mô tả các phương pháp cô lập đó. Sandbox của trình duyệt và ranh giới của container bổ sung cho nhau; một cái không thay thế cái kia.

Bắt đầu thu thập dữ liệu với Scrapeless

Khởi động quy trình thu thập dữ liệu và tự động hóa web của bạn với Scrapeless!
Đăng ký ngay hôm nay và nhận $5 tín dụng miễn phíkhông cần thẻ tín dụng.

Nhận tín dụng miễn phí của bạn ngay bây giờ tại Bảng điều khiển Scrapeless.
Bảng điều khiển Scrapeless hiển thị $5.00 trong Tín dụng Đội

Di chuyển Chrome ra khỏi Container ứng dụng

Một hình ảnh ứng dụng không có trình duyệt cài đặt puppeteer-core, mở một phiên làm việc trình duyệt từ xa, thực hiện công việc trang được phê duyệt và đóng kết nối. Dịch vụ trình duyệt mở rộng và nâng cấp một cách độc lập.

Cài đặt các gói chính xác đã sử dụng trong dự án xác minh:

bash Copy
npm install puppeteer-core@25.8.0 @scrapeless-ai/sdk@1.11.0

Lưu ý: Kết nối sau đây yêu cầu khóa API Scrapeless của bạn. Xuất SDK đã được kiểm tra cục bộ, nhưng môi trường không cần thông tin xác thực không thể mở trình duyệt đám mây.

javascript Copy
import { Puppeteer } from "@scrapeless-ai/sdk";

const browser = await Puppeteer.connect({
  sessionName: "browser-free-app",
  sessionTTL: 300,
  proxyCountry: "US",
  defaultViewport: null,
});

const page = await browser.newPage();
await page.goto("https://example.com", { waitUntil: "domcontentloaded" });
console.log(await page.title());
await browser.close();

Scrapeless Scraping Browser là lớp trình duyệt trong mẫu này. Xem qua thuật ngữ khởi đầu trình duyệt Scraping, trang sản phẩm, và giá cả trước khi áp dụng nó trong CI.

Tổ chức Ứng dụng quanh Ranh giới Từ xa

Container ứng dụng không còn cần dịch vụ Chrome trong cùng một dự án Compose. Nó chỉ cần mã Node.js, tệp khóa của nó, khách hàng Puppeteer Core và một bí mật được cung cấp khi chạy.

yaml Copy
services:
  worker:
    build: .
    init: true
    environment:
      SCRAPELESS_API_KEY: ${SCRAPELESS_API_KEY}
    read_only: true
    tmpfs:
      - /tmp:size=64m

Tệp Compose này thể hiện ranh giới ứng dụng, không phải trình duyệt đám mây. Khóa API đến từ kho bí mật triển khai. Worker có hệ thống tệp gốc chỉ đọc và một thư mục tạm thời bị giới hạn.

Cấu hình runtime Open Container Initiative định nghĩa quá trình, môi trường, gắn kết và tài nguyên Linux mà các runtime dịch sang quy trình container.

Chọn Mẫu Phù hợp

Sử dụng hình ảnh chính thức khi một artefact Puppeteer và Chrome khớp hoàn chỉnh có giá trị hơn một hình ảnh nhỏ. Cài đặt Chrome hệ thống khi nhóm nền tảng của bạn đã sở hữu phân phối trình duyệt và chính sách hệ điều hành. Sử dụng Puppeteer Core với Scrapeless Scraping Browser khi ứng dụng không nên đóng gói hoặc vận hành Chrome.

Quyết định có thể thay đổi theo công việc. Việc kết xuất PDF cho một mẫu nội bộ có thể được giữ trong một hình ảnh cục bộ được ghim. Việc trích xuất web công cộng cần ra ngoài trình duyệt khu vực có thể thuộc về một trình duyệt đám mây được quản lý. Giữ cả hai điều này dưới cùng một hợp đồng công việc để người gọi không phụ thuộc vào vị trí của trình duyệt.

Ví dụ trình duyệt đám mây Scrapeless Puppeteer cho thấy kết nối được quản lý trong một quy trình tự động rộng hơn.

Danh sách Kiểm Tra Hoạt Động

  • Ghim phiên bản Puppeteer, Chrome, hình ảnh cơ sở và tệp khóa.
  • Chạy một phiên khởi động trình duyệt và khẳng định tiêu đề trước khi công bố hình ảnh.
  • Sử dụng một quy trình khởi tạo và đóng các phiên trình duyệt trong finally.
  • Bảo tồn sandbox của trình duyệt cho các trang không đáng tin cậy.
  • Thiết lập CPU, bộ nhớ, IPC và giới hạn lưu trữ tạm thời một cách rõ ràng.
  • Đặt các khóa API trong kho bí mật thời gian chạy, không bao giờ trong các lớp hình ảnh.
  • Không giữ hơn ba worker đồng thời trên mỗi máy chủ mục tiêu trừ khi chủ sở hữu chấp thuận giới hạn khác.
  • Ghi lại gói, trình duyệt, hình ảnh, khu vực và phiên bản công việc với đầu ra.

Kết luận: Tách rời Khách hàng khỏi Chrome

Puppeteer trở nên dễ vận hành hơn khi gói khách hàng và thời gian chạy trình duyệt là những quyết định riêng biệt, rõ ràng. Ảnh chính thức gói chúng lại với nhau. Một ảnh tùy chỉnh cho phép đội ngũ của bạn sở hữu cả hai. Puppeteer Core và Scrapeless Scraping Browser tách chúng ra qua một kết nối quản lý.

Chọn một hợp đồng cho mỗi loại công việc, ghim nó lại, và kiểm tra ranh giới trình duyệt trước khi tải ứng dụng bắt đầu.


Sẵn sàng chạy Puppeteer mà không cần Chrome trong ảnh ứng dụng?

Tham gia cộng đồng của chúng tôi để yêu cầu kế hoạch miễn phí và kết nối với các nhà phát triển tách biệt khối lượng công việc trình duyệt khỏi dịch vụ Node.js: Discord · Telegram.

Đăng ký tại app.scrapeless.com để nhận thời gian chạy Scraping Browser miễn phí và kiểm tra mẫu công nhân không có trình duyệt.


Câu hỏi thường gặp

Q: Puppeteer Core có bao gồm Chrome không?

Puppeteer Core không tải xuống hoặc quản lý Chrome. Nó cần một đường dẫn thực thi rõ ràng hoặc một kết nối trình duyệt từ xa.

Q: Ảnh Puppeteer chính thức có an toàn hơn một ảnh tùy chỉnh không?

Ảnh chính thức cung cấp một cơ sở dữ liệu trình duyệt và phụ thuộc được tài liệu hóa, nhưng độ an toàn vẫn phụ thuộc vào nguồn gốc của ảnh, khả năng thời gian chạy, danh tính người dùng, chính sách sandbox, kiểm soát của máy chủ, và các trang đang được mở.

Q: Tại sao Chrome chỉ gặp sự cố bên trong Docker?

Container có thể thiếu tệp thực thi, thư viện liên kết, hỗ trợ sandbox, bộ nhớ chia sẻ, phông chữ, hoặc một quy trình khởi tạo thích hợp. Kiểm tra ranh giới gặp sự cố thay vì thay đổi mã điều hướng trước.

Q: Trình duyệt Puppeteer từ xa có cần một proxy không?

Trình duyệt từ xa cần một chính sách xuất phát phù hợp với công việc. Scrapeless Scraping Browser hỗ trợ proxy dân cư ở hơn 195 quốc gia; ghim quốc gia đã được phê duyệt để có một lần chạy nhất quán.

Q: Điều gì nên xảy ra khi các bộ chọn thay đổi?

Kiểm tra lại trang đã được lập trình và cập nhật các bộ chọn theo các vai trò, thuộc tính hoặc cấu trúc dữ liệu ổn định. Việc chuyển Chrome ra ngoài Docker không làm đóng băng DOM mục tiêu.

Q: Một công nhân Puppeteer nên sử dụng bao nhiêu đồng thời?

Giữ không quá ba công nhân cho mỗi máy chủ mục tiêu trừ khi chủ sở hữu phê duyệt giới hạn khác. Năng lực đoàn tàu trình duyệt và độ đồng thời của máy chủ mục tiêu là các điều khiển riêng biệt.

Q: Puppeteer Core có thể kết nối mà không cần một đại lý AI không?

Có. Puppeteer Core và Scrapeless SDK là các giao diện Node.js trực tiếp. Một đại lý AI là tùy chọn và không nên thay đổi quyền truy cập, độ đồng thời, hoặc quy tắc xử lý bí mật.

Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến ​​cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.

Bài viết phổ biến nhất

Danh mục