8

Bitbucket Pipelines कार्य निष्पादित करने के लिए डॉकर कंटेनर का उपयोग कर रहा है और डिफ़ॉल्ट रूप से डॉकर कंटेनर रूट के रूप में चलते हैं। यह एनपीएम की लाइफसाइक्ल स्क्रिप्ट के लिए एक समस्या है क्योंकि एनपीएम स्क्रिप्ट चलाने पर अपने विशेषाधिकारों को डाउनग्रेड करने का प्रयास करता है।क्या बिटबकेट पाइपलाइन डॉकर कंटेनर में गैर-रूट उपयोगकर्ता में बदलने का कोई आसान तरीका है?

postinstall स्क्रिप्ट को निष्पादित करते समय, NPM throws an error कि यह cannot run in wd %s %s (wd=%s) है। सबसे आसान समाधान --unsafe-perm ध्वज के साथ एनपीएम इंस्टॉल को चलाने के लिए है, लेकिन मुझे यह दृष्टिकोण पसंद नहीं है।

डोकर के best practices Dockerfiles लिखने के लिए कहा गया है कि: एक सेवा विशेषाधिकारों के बिना चला सकते हैं

हैं, तो उपयोग USER किसी गैर-रूट उपयोगकर्ता के लिए बदलने के लिए।

एक विशिष्ट डॉकर कंटेनर को कॉन्फ़िगर करते समय मैं एक नया, गैर-रूट उपयोगकर्ता बनाउंगा और इस उपयोगकर्ता के रूप में अपनी एनपीएम स्क्रिप्ट चलाऊंगा।

Pipelines documentation पढ़ने के बाद मुझे डॉकर के उपयोगकर्ता कमांड के बराबर कोई नहीं मिला। मैं useradd, chown और su (अभी तक परीक्षण नहीं किया गया) का उपयोग करने में सक्षम हो सकता हूं लेकिन क्या कोई आसान समाधान है?

दुर्भाग्य useradd, chown और subitbucket-pipelines.yml स्क्रिप्ट खंड को जोड़ने repo:push webhook में नाकाम रहने में पाइपलाइन और परिणाम टूट जाता है।

image: node:6.2 

pipelines: 
    default: 
    - step: 
     script: 
      - useradd --user-group --create-home --shell /bin/false node 
      - chown -R node: /opt/atlassian/bitbucketci/agent/build 
      - su -s /bin/sh -c "npm install" node 
      - su -s /bin/sh -c "npm run test:coverage --silent" node 

पाइपलाइन

{ 
    "code": 500, 
    "message": "There was an error processing your request. It has been logged (ID <removed>)." 
} 

उत्तर

1

सबसे सहज समाधान मैंने पाया गैर-रूट उपयोगकर्ता खाते ही अगर यह पहले से ही शामिल नहीं है बनाने के लिए है छवि में और निष्पादित आदेशों के लिए सेट करने के लिए gosu उपयोगिता का उपयोग करें।

पाइपलाइन 'build चरण पहले से ही $BUILD_DIR पर सेट कर रहा है, इसलिए अतिरिक्त chown आवश्यक नहीं है।

तो, Bitbucket पाइपलाइन डोकर कंटेनर में एक गैर-रूट उपयोगकर्ता आप करने के लिए बदलने के लिए सक्षम होने के लिए:

  1. अपने भंडार है कि Gosu उपयोगिता स्थापित करता है के लिए एक अतिरिक्त खोल स्क्रिप्ट जोड़ने (यह भी हो सकता है id -u {user} &>/dev/null || useradd ... के साथ) Pipelies config में एक कदम)
  2. कॉल पाइपलाइन config में पहले कदम के रूप install-gosu.sh स्क्रिप्ट,
  3. गैर-रूट बनाने के उपयोगकर्ता (जाँच यह पहले से ही पहले मौजूद है या नहीं,
  4. उपयोग ग्राम के रूप में सीधे शामिल osu को गैर-रूट उपयोगकर्ता के रूप में कमांड चलाने के लिए।

install-gosu.sh

#!/bin/bash 

GOSU_VERSION=1.10 
GNUPGHOME="$(mktemp -d)" 

set -x 

apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \ 
&& dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" \ 
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch" \ 
&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc" \ 
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \ 
&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \ 
&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \ 
&& chmod +x /usr/local/bin/gosu \ 
&& gosu nobody true \ 
&& apt-get purge -y --auto-remove ca-certificates wget 

bitbucket-pipelines.yml

image: node:6 

pipelines: 
    default: 
    - step: 
     script: 
      - bash $BITBUCKET_CLONE_DIR/install-gosu.sh 
      - id -u node &>/dev/null || useradd --user-group --create-home --shell /bin/false node 
      - gosu node npm install 
      - gosu node npm test 

यह आसानी से अन्य भाषाओं/उपयोगकर्ताओं/आदेश के लिए अनुकूलित किया जा सकता। बस node उपयोगकर्ता और npm आदेशों को जो कुछ भी आपको चाहिए, उसे स्वैप करें।

मैंने इस विधि का परीक्षण nodejs और python छवियों के साथ किया है।

2

के साथ प्रतिक्रिया इस प्रश्न में पता करने के लिए दो बातें हैं।


Bitbucket पाइपलाइन में गैर-रूट उपयोगकर्ता के रूप में चलाने के लिए, आप वास्तव में क्या कर सकते हैं कि तुम क्या सुझाव दिया है और उपयोगकर्ता डोकर आदेश का उपयोग करने के लिए। नोड: 6.2 छवि, गैर-रूट उपयोगकर्ता के लिए नक्शे नहीं है, इसलिए यदि आप चाहते हैं करने के लिए ताकि आप निम्नलिखित Dockerfile के साथ एक नया डोकर छवि बना सकते हैं:

FROM node:6.2 

USER foo 

500 त्रुटि आप कर रहे हैं प्रकट होता है प्राप्त YAML इस लाइन पर पार्स करने में कोई समस्या हो रहे हैं:

- chown -R node: /opt/atlassian/bitbucketci/agent/build 

':' YAML प्रारूप में एक विशेष चरित्र है। एक कुंजी-मूल्य जोड़ी को इंगित करना।

- "chown -R node: /opt/atlassian/bitbucketci/agent/build" 

मैं भी अब आप का निर्माण पथ के लिए नया डिफ़ॉल्ट वातावरण चर का उपयोग का सुझाव देते हैं: आदेश इसे ठीक करने के लिए, के बजाय इस तरह उद्धरण के अंदर है कि लाइन पर सामग्री डाल दिया। $ BITBUCKET_CLONE_DIR। तो लाइन को बदलने के बजाय

- "chown -R node: $BITBUCKET_CLONE_DIR" 
+0

प्रश्न। मैं अन्य पाइपलाइन सवालों में इस '/ opt/atlassian/bitbucketci/agent/build' के संदर्भ देख रहा हूं। क्या किसी को पता है कि कंटेनर के लिए एजेंट जानकारी कहां मिल रही है ताकि मैं जेनरेट किए गए बिल्ड को पकड़ सकूं? –

1

होने के लिए नोड छवि पहले से ही एक नोड उपयोगकर्ता बनाता है के बाद से (कम से कम 6.9+ में), तो आपको useradd जरूरत नहीं है। यह भी गाउन के बिना अच्छी तरह से काम करता प्रतीत होता है।अंत में, मैं एक स्क्रिप्ट इस तरह लग रही है - और यह ठीक हो गया लगता है:

image: node:7 

pipelines: 
    default: 
    - step: 
     script: 
      - su -s /bin/bash -c "npm install" node 
      - su -s /bin/bash -c "npm run build" node 
संबंधित मुद्दे

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