2017-03-07 28 views
9

क्रोम लिनक्स के लिए पहले से ही उपलब्ध नेतृत्वहीन मोड के साथ: https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.mdक्रोम - एडब्ल्यूएस लैम्ब्डा के लिएहेडलेस?

यह अभी कैनरी साथ ही काम करता है, लेकिन यह क्रोम 57.

एडब्ल्यूएस लैम्ब्डा पर गूगल क्रोम को चलाने के लिए किसी भी संभावना में सरकारी आ रहा है?

+1

मैंने वही बात सोच ली है। मैंने इसमें एक दरार ली लेकिन यह अभी तक काफी सही काम नहीं कर रहा है। मेरी प्रगति यहां है: https://github.com/adieuadieu/thingamajigs/tree/master/serverless-chrome-pdf यहां इस विषय पर एक धागा भी है: https://groups.google.com/a/chromium.org/डी/संदेश/नेतृत्वहीन-देव/qqbZVZ2IwEw/Wr9wmgb1EQAJ –

उत्तर

10

हां; यह संभव है।

Headless Chrome के गैर-डीबग निर्माण को संकलित करना एक बाइनरी उत्पन्न करता है जो ~ 125 एमबी है, और gzipped के दौरान केवल 44 एमबी के तहत। इसका मतलब है कि यह फ़ंक्शन के परिनियोजन पैकेज के लिए 250 एमबी असंपीड़ित और 50 एमबी आकार limitation के भीतर फिट बैठता है।

क्या (वर्तमान में) आवश्यक है क्रोम को/dev/shm पर साझा स्मृति का उपयोग किए बिना संकलित करने के लिए मजबूर करना है। headless-dev Google समूह here पर विषय पर एक धागा है।

यहां कुछ कदम हैं जिनका उपयोग मैंने हेडलेस क्रोम की बाइनरी बनाने के लिए किया है जो एडब्ल्यूएस लैम्ब्डा पर काम करेगा। वे this और this पर आधारित हैं।

  1. समुदाय एएमआई का उपयोग कर नाम AMZN-अमी-hvm-2016.03.3.x86_64-GP2 (हमें पश्चिम -2 अमी-7172b611) के साथ एक नया EC2 उदाहरण बनाएँ।
  2. कम से कम 16 जीबी मेमोरी के साथ एक इंस्टेंस प्रकार चुनें। संकलन समय में t2.xlarge पर लगभग 4-5 घंटे लगेंगे, या टी 2.2xlarge पर 2-3ish या c4.4xlarge पर लगभग 45 मिनट लगेंगे।
  3. अपने आप को एक रूट वॉल्यूम दें जो कम से कम 30 जीबी है (40 जीबी यदि आप डिबग बिल्ड को संकलित करना चाहते हैं- जिसे आप लैम्ब्डा में अपलोड नहीं कर पाएंगे क्योंकि यह बहुत बड़ा है।)
  4. एसएसएच नए उदाहरण में और चलाएँ:
sudo printf "LANG=en_US.utf-8\nLC_ALL=en_US.utf-8" >> /etc/environment 
sudo yum install -y git redhat-lsb python bzip2 tar pkgconfig atk-devel alsa-lib-devel bison binutils brlapi-devel bluez-libs-devel bzip2-devel cairo-devel cups-devel dbus-devel dbus-glib-devel expat-devel fontconfig-devel freetype-devel gcc-c++ GConf2-devel glib2-devel glibc.i686 gperf glib2-devel gtk2-devel gtk3-devel java-1.*.0-openjdk-devel libatomic libcap-devel libffi-devel libgcc.i686 libgnome-keyring-devel libjpeg-devel libstdc++.i686 libX11-devel libXScrnSaver-devel libXtst-devel libxkbcommon-x11-devel ncurses-compat-libs nspr-devel nss-devel pam-devel pango-devel pciutils-devel pulseaudio-libs-devel zlib.i686 httpd mod_ssl php php-cli python-psutil wdiff --enablerepo=epel 

यम कुछ संकुल मौजूदा नहीं के बारे में शिकायत करेंगे। जो कुछ। मैंने उनको नहीं देखा है। हालांकि, मुझे headless_shell बनाने से रोकना प्रतीत नहीं होता था। बहुत कम यम पर नजर डालें और आगे बढ़ें। अगला:

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git 
echo "export PATH=$PATH:$HOME/depot_tools" >> ~/.bash_profile 
source ~/.bash_profile 
mkdir Chromium && cd Chromium 
fetch --no-history chromium 
cd src 

इस बिंदु पर हमें क्रोम कोड में बहुत छोटा बदलाव करना होगा। लिनक्स पर डिफ़ॉल्ट रूप से, क्रोम /dev/shm पर tmpfs होने के लिए मानता है। लैम्ब्डा फ़ंक्शन में कोई tmpfs उपलब्ध नहीं है। :-(

फ़ाइल हम बदलना होगा src/base/files/file_util_posix.cc है। संशोधित GetShmemTempDir() इस तरह यह हमेशा OS के अस्थायी निर्देशिका (/tmp) देता है कि। यह सिर्फ GetShmemTempDir() समारोह में पूरे #if defined(OS_LINUX) ब्लॉक दूर करने के लिए है करने के लिए एक आसान तरीका।

bool GetShmemTempDir(bool executable, FilePath* path) { 
#if defined(OS_LINUX) 
    bool use_dev_shm = true; 
    if (executable) { 
    static const bool s_dev_shm_executable = DetermineDevShmExecutable(); 
    use_dev_shm = s_dev_shm_executable; 
    } 

// cuz lambda 
use_dev_shm = false; // <-- add this. Yes it's pretty hack-y 

    if (use_dev_shm) { 
    *path = FilePath("/dev/shm"); 
    return true; 
    } 
#endif 
    return GetTempDir(path); 
} 
कि परिवर्तन के साथ

, यह संकलन करने का समय है src निर्देशिका में बातें चुनने वापस ऊपर, कुछ तर्क और उसके बाद (पिछले आदेश) संकलन सेट का निर्माण शुरू:। एक कम भारी परिवर्तन हार्डकोड करने use_dev_shmfalse है प्रक्रिया

mkdir -p out/Headless 
echo 'import("//build/args/headless.gn")' > out/Headless/args.gn 
echo 'is_debug = false' >> out/Headless/args.gn 
echo 'symbol_level = 0' >> out/Headless/args.gn 
echo 'is_component_build = false' >> out/Headless/args.gn 
echo 'remove_webcore_debug_symbols = true' >> out/Headless/args.gn 
echo 'enable_nacl = false' >> out/Headless/args.gn 
gn gen out/Headless 
ninja -C out/Headless headless_shell 

अंत में हम प्रासंगिक फ़ाइल (फाइलों) का टैरबॉल बनाते हैं जिसे हमें लैम्ब्डा में चलाने की आवश्यकता होगी।

mkdir out/headless-chrome && cd out 
cp Headless/headless_shell Headless/libosmesa.so headless-chrome/ 
tar -zcvf chrome-headless-lambda-linux-x64.tar.gz headless-chrome/ 
लैम्ब्डा के भीतर

, दूरस्थ डीबगर इंटरफ़ेस को क्रियान्वित करने से सक्षम साथ headless_shell चलाएँ:

/path/to/headless_shell --disable-gpu --no-sandbox --remote-debugging-port=9222 --user-data-dir=/tmp/user-data --single-process --data-path=/tmp/data-path --homedir=/tmp --disk-cache-dir=/tmp/cache-dir 

के बाद से/tmp एक लैम्ब्डा समारोह में केवल लिखने योग्य जगह है, वहाँ झंडे का एक समूह सिर्फ क्रोम कह रहे हैं जहां इसका डेटा डंप करना है। वे जरूरी नहीं हैं लेकिन यह क्रोम को खुश रखता है। ध्यान दें कि यह mentioned है कि --disable-gpu ध्वज के साथ, हमें libosmesa.so की आवश्यकता नहीं है, जिसकी चूक हमारे पैकेज ज़िप से लगभग 4 एमबी को बंद कर देगी।

मैंने शुरू करने के लिए आसान बनाने के उद्देश्य से this प्रोजेक्ट शुरू किया है। यह प्री-बिल्ट हेडलेस क्रोम बाइनरी के साथ आता है जिसे आप here प्राप्त कर सकते हैं।

संबंधित मुद्दे