मैं विलक्षणता के साथ शुरुआत कर रहा हूँ।

मैं लंबे समय में क्या हासिल करना चाहता हूं: मेरे पास निर्भरता की एक लंबी सूची के साथ एक प्रोग्रामिंग प्रोजेक्ट है, और मैं अपनी कंपनी में अन्य लोगों को प्रोग्राम देने में सक्षम होना चाहता हूं, बिना निर्भरता या गलत संस्करणों के कारण बग होने के कारण निर्भरताओं की।
काम का माहौल आसानी से प्रदान करने के लिए अब सिंगुलैरिटी का उपयोग करने का विचार था।

इसका परीक्षण करने के लिए, मैंने एक हैलो वर्ल्ड एप्लिकेशन लिखा था जिसे अब मैं एक कंटेनर में चलाना चाहता हूं। मेरे पास एक फ़ोल्डर HelloWorld/ है जिसमें C++ Qt प्रोजेक्ट के लिए स्रोत कोड है। तब मैंने निम्नलिखित नुस्खा फ़ाइल लिखी:

project.recipe

Bootstrap: docker
From: ubuntu:18.04

%setup
    cp -R <some_folder>/HelloWorld ${SINGULARITY_ROOTFS}/HelloWorld

%post
    apt update
    apt-get install -y qt5-default
    apt install -y g++
    apt-get install -y build-essential

    cd HelloWorld
    qmake
    make
    echo "after build:"
    ls

%runscript
    echo "before execution:"
    ls HelloWorld/

    ./HelloWorld/HelloWorld

जहां मेरी वर्तमान डिबगिंग प्रक्रिया के लिए इकोस और निर्देशिका लिस्टिंग हैं।

मैं sudo singularity build --writable project.img project.recipe का उपयोग करके सफलतापूर्वक एक छवि फ़ाइल बना सकता हूं। (मेरा डिबगिंग आउटपुट मुझे दिखाता है कि निष्पादन योग्य सफलतापूर्वक बनाया गया था।)

समस्या अब यह है कि अगर मैं इसे ./project.img, या singularity run project.img का उपयोग करके चलाने का प्रयास करता हूं, तो इसे निष्पादन योग्य नहीं मिलेगा।
अपने डिबगिंग आउटपुट का उपयोग करते हुए, मुझे पता चला कि %runscript की लाइनें कंटेनर के बाहर के फोल्डर का उपयोग करती हैं।
ट्यूटोरियल जैसे https://sylabs.io/guides/3.1/user-guide/ build_a_container.html ने मुझे ऐसा प्रतीत किया जैसे मेरा नुस्खा जाने का रास्ता था, लेकिन जाहिर तौर पर ऐसा नहीं है?

मेरे सवाल:

  1. क्या मेरे निष्पादन योग्य तक पहुंचने का कोई तरीका है? क्या मैं इसे गलत कह रहा हूँ?
  2. क्या जिस तरह से मैं इसे करता हूं, वैसे ही इसे किया जाना चाहिए? या क्या कोई सामान्य रूप से कंटेनर के बाहर निष्पादन योग्य प्राप्त करने जैसा कुछ करेगा और फिर उस बाहरी फ़ाइल को कॉल करने के लिए कंटेनर का उपयोग करेगा? या क्या कोई अलग सर्वोत्तम अभ्यास है?
  3. यदि निष्पादन योग्य को संकलन के बाद कंटेनर के बाहर कॉपी किया जाना है, तो मैं यह कैसे कर सकता हूं? जब मैं %post के अंदर होता हूं, तो मैं बाहरी फ़ोल्डरों तक कैसे पहुंच सकता हूं?
  4. क्या मैं जो हासिल करना चाहता हूं उसके लिए यह सबसे अच्छी कार्य प्रक्रिया है? बाद में, मेरा विचार यह है कि बड़े प्रोजेक्ट को कंटेनर में भी कॉपी किया जाता है, निर्भरता या तो स्थापित की जाती है या कॉपी की जाती है, फिर प्रोजेक्ट संकलित किया जाता है और अंत में इसका स्रोत हटा दिया जाता है। मैंने एक भंडार का उपयोग करने पर भी विचार किया, लेकिन मेरे पास परियोजना खुली भंडार में नहीं हो सकती है, और मैं कोई पासवर्ड स्टोर नहीं करना चाहता हूं।
0
Aziuth 25 अगस्त 2020, 18:21

1 उत्तर

सबसे बढ़िया उत्तर
  1. सबसे पहले, %files का उपयोग करें, %setup का उपयोग न करें। %setup रूट के रूप में चलाया जाता है और सीधे होस्ट सर्वर को संशोधित कर सकता है। आप बहुत आसानी से और गलती से चीजों को बिना समझे ही तोड़ सकते हैं। आप इस तरह से समान प्रभाव प्राप्त कर सकते हैं:
%files
    some_folder/HelloWorld /HelloWorld
  1. आप इसे गलत कह रहे हैं। अपने %setup (और उम्मीद है कि अब आपके %files) चरणों में, आप डेटा को /HelloWorld में कॉपी कर रहे हैं। आपके %runscript में आप ./HelloWorld/HelloWorld को कॉल कर रहे हैं जो $PWD/HelloWorld/HelloWorld के बराबर है। चूँकि विलक्षणता स्वतः ही $PWD (साथ ही $HOME और कुछ अन्य निर्देशिकाओं) में आरोहित हो जाती है, आप वह नहीं कह रहे हैं जिसे आप कॉल करने का प्रयास कर रहे हैं।

  2. आप कंटेनर के बाहर निष्पादन योग्य की प्रतिलिपि नहीं बनाते हैं, आपको केवल यह सुनिश्चित करने की ज़रूरत है कि आप जो निष्पादित कर रहे हैं वह वही है जहां आपको लगता है कि यह है।

  3. %post में होस्ट फाइल सिस्टम तक कोई पहुंच नहीं है, आपके पास पहले %files के माध्यम से कॉपी की गई हर चीज होनी चाहिए।

  4. यह एक उचित कार्यप्रवाह है। अपने परिवर्तनों को ट्रैक करने के लिए कोड के लिए एक स्थानीय निजी रेपो रखना शायद एक अच्छा विचार है, लेकिन यह आपकी कॉल है।

1
tsnowlan 26 अगस्त 2020, 11:23