2016-09-08 11 views
7

का उपयोग करके मानक छवियों में फ़ाइलों को जोड़ना मुझे यकीन नहीं है कि कुछ स्पष्ट रूप से मुझसे बच निकलता है या यदि यह संभव नहीं है, लेकिन मैं डॉकर हब से छवियों के साथ एक संपूर्ण एप्लिकेशन स्टैक लिखने की कोशिश कर रहा हूं।डॉकर-कंपोज़

उनमें से एक mysql है और यह वॉल्यूम के माध्यम से कस्टम कॉन्फ़िगरेशन फ़ाइलों को जोड़ने और आरोहित निर्देशिका से .sql-फ़ाइलों को चलाने का समर्थन करता है।

लेकिन, मेरे पास मशीन पर ये फ़ाइलें हैं जहां मैं मेजबान पर नहीं, डॉकर-कंपोज़ चला रहा हूं। क्या स्थानीय मशीन से फ़ाइलों को एंट्रीपॉइंट/सेमीडी चलाने से पहले कंटेनर में कॉपी करने का कोई तरीका नहीं है? क्या मुझे वास्तव में इस मामले के लिए सबकुछ की स्थानीय छवियां बनाना है?

+0

मैंने आपके डेटा को अपनी स्थानीय मशीन से होस्ट (या तो स्थानीय या दूरस्थ) में कॉपी करने के दो तरीके प्रदान किए। यहां देखें http://stackoverflow.com/a/39348811/1556338 सामान्य रूप से आप अपने डेटा को छवि से दूर रखना चाहते हैं। इससे आपकी छवि विभिन्न परिवेशों में पुन: प्रयोग योग्य हो जाती है (dev/test/prod, clientA, clientB, आदि)। – Alkaline

+0

हां, 'डॉकर सीपी' काम करेगा लेकिन डॉकर-कंपोज़ के हिस्से के रूप में नहीं, यह एक अलग कदम है। यह हासिल करने के लिए सिर्फ एक शेल स्क्रिप्ट में डॉकर-रचना को लपेटना अच्छा होगा। –

+0

दुर्भाग्यवश डॉकर रचना सीमित है। चूंकि आपका उपयोग अधिक विशिष्ट हो जाता है, इसलिए आप कुछ चीजों के लिए खोल स्क्रिप्टिंग का उपयोग करने से बचने में सक्षम नहीं होंगे। रचना नए झुंड मोड के साथ भी काम नहीं करता है। – Alkaline

उत्तर

9

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

यह विकल्प आपकी छवि बनाने के लिए डॉकर-कंपोज़ का उपयोग करके हासिल किया जाता है, और यह बिल्ड बिल्ड निर्देशिका से किसी भी फाइल को दूरस्थ डॉकर इंजन पर भेज देगा।

version: '2' 

services: 
    my-db-app: 
    build: db/. 
    image: custom-db 

और db/Dockerfile लगेगा जैसे:

FROM mysql:latest 
COPY ./sql /sql 

entrypoint/cmd अपरिवर्तित रहेंगी आपका docker-compose.yml कैसा दिखेगा। यदि छवि पहले से मौजूद है और आपको एसक्यूएल फाइलों को बदलने की जरूरत है तो आपको docker-compose up --build चलाने की आवश्यकता होगी।


विकल्प बी: अपने डाटा स्टोर करने की एक मात्रा का प्रयोग करें। यह सीधे डॉकर-कंपोज़ के अंदर नहीं किया जा सकता है। हालांकि यह छवि के बाहर से कंटेनर में फ़ाइलों को शामिल करने का पसंदीदा तरीका है। आप पैक और उन फ़ाइलों को अनपैक करने के डोकर CLI और टार की तरह एक आदेश के साथ इनपुट पुनर्निर्देशन का उपयोग करके नेटवर्क के पार मात्रा पॉप्युलेट कर सकती stdin पर भेजा जा रहा है:

tar -cC sql . | docker run --rm -it -v sql-files:/sql \ 
    busybox /bin/sh -c "tar -xC /sql" 

भागो एक स्क्रिप्ट के माध्यम से और फिर उसी की है कि स्क्रिप्ट उस कॉन्फ़िगर को पुनः लोड करने के लिए डीबी कंटेनर को उछालती है।


विकल्प C: नेटवर्क संलग्न फाइल सिस्टम के कुछ प्रकार का उपयोग करें।

# create a reusable volume 
$ docker volume create --driver local \ 
    --opt type=nfs \ 
    --opt o=addr=192.168.1.1,rw \ 
    --opt device=:/path/to/dir \ 
    foo 

# or from the docker run command 
$ docker run -it --rm \ 
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/host/path \ 
    foo 

# or to create a service 
$ docker service create \ 
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/host/path \ 
    foo 

विकल्प डी:: यदि आप मेजबान जहाँ आप अपने डोकर CLI चल रहे हैं पर एनएफएस कॉन्फ़िगर कर सकते हैं, तो आप नीचे दिए गए विकल्पों में से एक का उपयोग कर दूरस्थ डोकर नोड से उन NFS साझेदारियों से कनेक्ट कर सकते झुंड मोड के साथ, आप फ़ाइलों को अपनी छवि में कॉन्फ़िगर के रूप में शामिल कर सकते हैं। यह कॉन्फ़िगरेशन फ़ाइलों को अनुमति देता है, जो सामान्य रूप से घुमाव में किसी भी नोड पर धकेलने की आवश्यकता होती है, जहां नोड की मांग पर भेजा जाता है जहां आपकी सेवा चल रही है। यह इसे परिभाषित करने के लिए docker-compose.yml फ़ाइल का उपयोग करता है, लेकिन स्वामी मोड डॉकर-कंपोज़ का उपयोग नहीं कर रहा है, इसलिए यह आपकी विशिष्ट आवश्यकताओं के अनुरूप नहीं हो सकता है। आप एक नोड स्वाद मोड क्लस्टर चला सकते हैं, इसलिए यह विकल्प उपलब्ध है भले ही आपके पास केवल एक नोड हो। इस विकल्प की आवश्यकता है कि आपकी प्रत्येक एसक्यूएल फाइलों को एक अलग कॉन्फ़िगरेशन के रूप में जोड़ा जाता है।

version: '3.4' 

configs: 
    sql_file_1: 
    file: ./file_1.sql 

services 
    my-db-app: 
    image: my-db-app:latest 
    configs: 
     - source: sql_file_1 
     target: /sql/file_1.sql 
     mode: 444 

तो बजाय एक docker-compose up, आप एक docker stack deploy -c docker-compose.yml my-db-stack चलाने चाहते हैं: docker-compose.yml कैसा दिखेगा।

services: 
    my-db-app: 
    command: /shell_scripts/go.sh 
    volumes: 
     - ./shell_scripts:/shell_scripts 
3

यह मैं इसे कैसे संस्करणों के साथ कर रहा हूँ है सेवाओं द्वारा साझा किया गया है और झुंड के सभी नोड्स में उपलब्ध है (cloudstor चालक का उपयोग करके, जो बदले में AWS EFS दृढ़ता के लिए अंतर्निहित है)।

version: '3.3' 
services: 
    my-db-app: 
    command: /shell_scripts/go.sh 
    volumes: 
     shell_scripts:/shell_scripts 
volumes: 
    shell_scripts: 
     driver: "cloudstor:aws" 
+2

यह तब काम नहीं करता जब shell_scripts रिमोट डॉकर सर्वर से किसी भिन्न होस्ट पर रहता है। – BMitch

0

इस सवाल का एक और अधिक हाल ही में अद्यतन के रूप में:: अमेज़न पर होस्ट एक डोकर झुंड के साथ, उदाहरण के लिए, आप एक मात्रा है कि हो सकता है परिभाषित कर सकते हैं

2

मेरे प्रतिष्ठा टिप्पणी करने के लिए इसलिए मैं एक नया जवाब बना रहा हूं, Adam Spence बहुत कम है के जवाब याद आ रही है "-" वॉल्यूम विकल्प के लिए, क्योंकि मात्रा एक सरणी, नीचे की तरह होना चाहिए:

services: 
    my-db-app: 
    command: /shell_scripts/go.sh 
    volumes: 
     - ./shell_scripts:/shell_scripts 
+1

आप अभी भी कम प्रतिष्ठा के साथ भी संपादन का सुझाव दे सकते हैं। प्रत्येक उत्तर के तहत "इस उत्तर में सुधार करें" विकल्प देखें। – BMitch

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

  • कोई संबंधित समस्या नहीं^_^