2016-03-23 5 views
14

के साथ डॉकर कंटेनर में वॉल्यूम के रूप में माउंट करने के लिए कैसे करें मैं एक डॉकर कंटेनर में जेनकिन्स इंस्टेंस चलाने के लिए चाहता हूं।डॉकर सॉकेट को सही समूह

मैं जेनकींस ही दास में परीक्षण चलाने के लिए के रूप में डोकर कंटेनर ऊपर स्पिन करने में सक्षम होना चाहता हूँ।

ऐसा लगता है यह करने के लिए सबसे अच्छा तरीका है

docker run -v /var/run.docker.sock:/var/run/docker.sock -p 8080:8080 -ti my-jenkins-image 

source

उपयोग करने के लिए है Dockerfile मैं उपयोग कर रहा हूं

FROM jenkins 
COPY plugins.txt /usr/share/jenkins/plugins.txt 
RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt 

USER root 
RUN apt-get update && apt-get install -y docker.io 
RUN usermod -aG docker jenkins 
USER jenkins 

अगर मैं अपने चल रहे कंटेनर में एक बैश सत्र शुरू करने और मेरी छवि पर docker info चलाने मैं

$ docker info 
FATA[0000] Get http:///var/run/docker.sock/v1.18/info: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS? 

पाने और

docker exec -u 0 -ti cocky_mccarthy bash 
[email protected]:/# docker info 
Containers: 42 
Images: 50 
... 

तो मैं docker समूह मैं लगता है कि अगर मैं रूट के रूप में बैश सत्र चलाने जेनकिन्स उपयोगकर्ता को आंतरिक डॉकर के लिए समूह जोड़ना है इसलिए सॉकेट बिना सूडो के पठनीय नहीं है। यह एक समस्या है क्योंकि जेनकिंस डॉकर प्लगइन इत्यादि सूडो का उपयोग करने के लिए स्थापित नहीं हैं।

मैं सॉकेट कैसे माउंट कर सकता हूं ताकि इसे बिना सुडो के छवि से उपयोग किया जा सके?

+0

क्या आपको अपनी समस्या का समाधान मिला? मुझे अभी एक ही समस्या का सामना करना पड़ रहा है –

उत्तर

5

मैं अपने dockerfile थे, लेकिन एक छोटे से संपादित किया: छवि का निर्माण करने के बाद

FROM jenkins 
COPY plugins.txt /usr/share/jenkins/plugins.txt 
RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt 

USER root 
RUN apt-get update 
RUN groupadd docker && gpasswd -a jenkins docker 
USER jenkins 

मैं (मैं centos7 पर हूँ) का उपयोग कर इसे शुरू कर सकते हैं:

docker run -d \ 
-v /var/run/docker.sock:/var/run/docker.sock \ 
    -v $(which docker):/usr/bin/docker:ro \ 
    -v /lib64/libdevmapper.so.1.02:/usr/lib/x86_64-linux-gnu/libdevmapper.so.1.02 \ 
    -v /lib64/libudev.so.0:/usr/lib/x86_64-linux-gnu/libudev.so.0 \ 
    -p 8080:8080 \ 
    --name jenkins \ 
    --privileged=true -t -i \ 
test/jenkins 

आप को स्थापित करने की कोशिश की अपनी छवि के अंदर पैकेज docker.io। लेकिन यह पैकेज आपके मेजबान पर भी है (अन्यथा इसमें डॉकर कंटेनर चलाने के लिए संभव नहीं है)। इसलिए इसे अपने डॉकर फ़ाइल में इंस्टॉल करने के बजाय इसे अपने कंटेनर पर माउंट करने की अनुशंसा की जाती है। मुझे लगता है कि घुड़सवार/lib64/... Centos 7.

$ docker exec -it 9fc27d5fcec1 bash 
[email protected]:/$ whoami 
jenkins 
[email protected]:/$ docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS        NAMES 
9fc27d5fcec1  test    "/bin/tini -- /usr/lo" 6 minutes ago  Up 6 minutes  0.0.0.0:8080->8080/tcp, 50000/tcp jenkins 
+2

मेरे पास ओपी के समान प्रश्न है, मुझे यह पोस्ट उपयोगी साबित हुआ (हालांकि यह अनुमतियों को हल नहीं करता है)। http://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/ लेखक मेजबान से डॉकर बाइनरी को कंटेनर में घुमाने के खिलाफ सलाह देता है: " यह अब विश्वसनीय नहीं है, क्योंकि डॉकर इंजन अब (लगभग) स्थिर पुस्तकालयों के रूप में वितरित नहीं किया गया है। " – ldirer

+0

कुछ समय पहले मैंने एक नज़र डाली थी। आपका क्या मतलब है कि यह अब विश्वसनीय नहीं है? मैंने अभी एक कंटेनर शुरू किया है और .sock और bin को घुमाया है और मैं इसमें डॉकर का उपयोग कर सकता हूं (1.12) या क्या मैं गलत हूं? धन्यवाद – lvthillo

+0

ईमानदारी से मैं आपको उचित उत्तर देने के लिए पर्याप्त जानकारी नहीं दे रहा हूं, मैं बस यह इंगित करना चाहता था कि मैंने जो लिंक पोस्ट किया है, उसके खिलाफ सलाह देता है। – ldirer

8

थोड़ा देर के लिए विशिष्ट है, लेकिन यह अन्य उपयोगकर्ताओं को, जो एक ही समस्या के साथ संघर्ष कर रहे हैं मदद कर सकता है:

समस्या यहाँ है कि आपके डॉकर होस्ट पर docker समूह में आपके कंटेनर के अंदर docker समूह की आईडी से एक अलग समूह आईडी है। चूंकि डिमन केवल आईडी के बारे में परवाह करता है और समूह के नाम के बारे में नहीं, इसलिए आपका समाधान केवल तभी काम करेगा जब इन आईडी का दुर्घटना हो।

डॉकर इंजन शुरू करते समय -H option का उपयोग करके यूनिक्स सॉकेट का उपयोग करने के बजाय या तो इसे हल करने का तरीका टीसीपी का उपयोग कर रहा है। आपको बहुत सावधान होना चाहिए, क्योंकि इससे आपके सिस्टम पर रूट पहुंच प्राप्त करने के लिए इस पोर्ट तक पहुंचने की अनुमति मिलती है।

यह सुनिश्चित करने का एक और सुरक्षित तरीका यह सुनिश्चित कर रहा है कि कंटेनर के अंदर docker समूह कंटेनर के बाहर docker समूह के समान समूह आईडी को समाप्त कर देता है।

docker build --build-arg DOCKER_GROUP_ID=`getent group docker | cut -d: -f3` -t my-jenkins-image . 

का उपयोग कर इस के बाद

FROM jenkinsci 
ARG DOCKER_GROUP_ID 

USER root 
RUN curl -o /root/docker.tgz https://get.docker.com/builds/Linux/x86_64/docker-1.12.5.tgz && tar -C /root -xvf /root/docker.tgz && mv /root/docker/docker /usr/local/bin/docker && rm -rf /root/docker* 
RUN curl -L https://github.com/docker/compose/releases/download/1.7.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose 
RUN groupadd -g $DOCKER_GROUP_ID docker && gpasswd -a jenkins docker 
USER jenkins 

और फिर यह निर्माण आप अपनी छवि को चलाने और गैर के रूप में उपयोग कर सकते है डोकर कर सकते हैं:

Dockerfile: आप इस का उपयोग कर अपने docker build के लिए बहस का निर्माण कर सकते हैं रूट

docker run -v /var/run/docker.sock:/var/run/docker.sock -p 8080:8080 -ti my-jenkins-image 

क्योंकि यह समाधान आपूर्ति पर निर्भर करता है जब छवि बनाई जा रही है तो डॉकर डिमन के लिए सही समूह आईडी को जी, इस छवि को मशीनों (ओं) पर बनाया जाना चाहिए जहां इसका उपयोग किया जा रहा है। यदि आप छवि बनाते हैं, तो इसे दबाएं और कोई और इसे अपनी मशीन पर खींचता है, संभावना है कि समूह आईडी फिर से मेल नहीं खाएगा।

+1

यह सुनिश्चित करना कि मेजबान पर 'डॉकर' समूह आईडी संगत था और कंटेनर के अंदर बिल्कुल वही था जो हमें एक ही समस्या का सामना करते समय ठीक करने के लिए आवश्यक था। धन्यवाद! – advancingu

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