मैं डॉकटर-कंपोज़ के साथ निर्मित छवि के नाम को कैसे परिभाषित करूं


205

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

wildfly:
  build: /path/to/dir/Dockerfile
  container_name: wildfly_server
  ports:
   - 9990:9990
   - 80:8080
  environment:
   - MYSQL_HOST=mysql_server
   - MONGO_HOST=mongo_server
   - ELASTIC_HOST=elasticsearch_server
  volumes:
   - /Volumes/CaseSensitive/development/wildfly/deployments/:/opt/jboss/wildfly/standalone/deployments/
  links:
   - mysql:mysql_server
   - mongo:mongo_server
   - elasticsearch:elasticsearch_server

जब मैं docker-composeसब कुछ निष्पादित करता हूं तो ठीक है, लेकिन मुझे नई छवि के लिए एक यादृच्छिक नाम मिलता है। क्या बिल्ड इमेज में नाम सेट करना संभव है?


18
यदि आप छवि बनाने के लिए docker-compose का उपयोग कर रहे हैं, तो छवि का नाम हमेशा ऐसा रहने वाला है <project>_<service>, जहां <service>इस उदाहरण में है wildflyऔर जिस निर्देशिका नाम में आप हैं, उस प्रोजेक्ट को डिफॉल्ट करते हैं। आप इसे -pया COMPOSE_PROJECT_NAMEपर्यावरण चर के साथ बदल सकते हैं । कस्टम छवि नाम सेट करने का कोई तरीका नहीं है।
dnephin

1
क्या कोई स्वीकार्य उत्तर नहीं है?
अमानीका

docs.docker.com/docker-cloud/apps/service-links - इस विषय के बारे में आधिकारिक दस्तावेज
इवान एरेकी

2
आप भी सेट कर सकते हैं COMPOSE_PROJECT_NAME=xमें .envऔर अपने कंटेनर बुलाया जाएगा{x}_{service}_{#}
eMPee584

जवाबों:


182

Docker-compose संस्करण 2 फ़ाइल प्रारूप के लिए, आप एक सेवा के लिए एक छवि बना सकते हैं और टैग कर सकते हैं और फिर दूसरी सेवा के लिए उसी निर्मित छवि का उपयोग कर सकते हैं।

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

version: '2'

services:
  es-master:
    build: ./elasticsearch
    image: porter/elasticsearch
    ports:
      - "9200:9200"
    container_name: es_master

  es-node:
    image: porter/elasticsearch
    depends_on:
      - es-master
    ports:
      - "9200"
    command: elasticsearch --discovery.zen.ping.unicast.hosts=es_master

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


57
विकल्प container_name:ने वास्तव में मदद की।
ब्रूनो बीरी

2
क्या आपको यकीन है कि यह काम करता है? buildऔर imageपरस्पर अनन्य हैं। मुझे "सेवा xxx में एक छवि और निर्माण पथ दोनों निर्दिष्ट हैं। एक सेवा या तो एक छवि का निर्माण कर सकती है या किसी मौजूदा छवि का उपयोग कर सकती है, दोनों नहीं।"
बुरहान अली

3
ओह कोई बात नहीं। उन दोनों को एक साथ v2 प्रारूप में और बाद में उपयोग किया जा सकता है। मैं जिस चीज का परीक्षण कर रहा था, उसने एक संस्करण निर्दिष्ट नहीं किया था इसलिए मुझे लगता है कि इसे v1 मान लिया गया था।
बुरहान अली

3
विकल्प
कंटेनर_नाम

2
@BrunoBieri फ़ाइल depends_onमें सेवा के नाम का उपयोग करता है doker-compose, कोई कंटेनर नाम निर्दिष्ट करने की आवश्यकता नहीं है। यहां तक ​​कि उदाहरण इसे दिखाता है depends_on: es-masterऔर नहींdepends_on: es_master
ब्लूफैस्ट

65

डॉक-कंपोज़ प्रति 1.6.0 के अनुसार :

यदि आप नए फ़ाइल प्रारूप का उपयोग कर रहे हैं, तो आप अब बिल्ड और छवि कुंजी दोनों निर्दिष्ट कर सकते हैं। docker-compose buildछवि का निर्माण करेगा और इसे आपके द्वारा निर्दिष्ट नाम के साथ टैग docker-compose pullकरेगा , जबकि इसे खींचने का प्रयास करेगा।

तो आपका docker-compose.ymlहोगा

version: '2'
services:
  wildfly:
      build: /path/to/dir/Dockerfile
      image: wildfly_server
      ports:
       - 9990:9990
       - 80:8080

डॉकटर-रचना को अद्यतन करने के लिए

sudo pip install -U docker-compose==1.6.0

1
त्रुटि: सत्यापन विफल, कारण (ओं): कॉर्न्सअप में एक छवि और निर्माण पथ दोनों निर्दिष्ट हैं। एक सेवा या तो छवि को बनाया जा सकता है या मौजूदा छवि का उपयोग कर सकता है, दोनों नहीं। (
डॉकटर

@ zx1986 इसके लिए आपको डॉकटर-कम्पोज़ का नया संस्करण प्रयोग करना होगा। फ़ाइल को इस docs.docker.com/compose/compose-file/#upmission के संदर्भ में अद्यतन करें जो मेरे उत्तर के आधार पर अपडेट किया गया है
arulraj.net

50

विकल्प 1: डिफ़ॉल्ट छवि नाम को इंगित करना

Docker-compose द्वारा निर्मित छवि का नाम डिफ़ॉल्ट रूप से फ़ोल्डर के नाम पर निर्भर करता है, लेकिन आप --project-nameतर्क का उपयोग करके इसे ओवरराइड कर सकते हैं :

$ docker-compose --project-name foo build bar
$ docker images foo_bar

विकल्प 2: छवि नाम निर्दिष्ट करना

एक बार जब डॉकटर-रचना 1.6.0 बाहर हो जाती है, तो आप एक स्पष्ट छवि नाम निर्दिष्ट कर सकते हैं build:और image:देखें ( arulraj.net का उत्तर देखें )।

विकल्प 3: कंटेनर से छवि बनाएं

एक तीसरा कंटेनर से एक छवि बनाने के लिए है:

$ docker-compose up -d bar
$ docker commit $(docker-compose ps -q bar) foo_bar
$ docker-compose rm -f bar

1
--project-nameअब स्वीकार नहीं किया जा रहा है। १.२३.२ का उपयोग करना
स्टीवन

21

आपके उपयोग के मामले के आधार पर, आप एक ऐसी छवि का उपयोग कर सकते हैं जो पहले से ही बनाई गई है और यह नाम निर्दिष्ट करें docker-compose

हमारे पास एक उत्पादन उपयोग का मामला है जहां हमारे CI सर्वर ने एक डॉकर इमेज नाम दिया है। ( docker build -t <specific_image_name> .)। एक बार नामित छवि निर्दिष्ट हो जाने के बाद, हमारा docker-composeहमेशा विशिष्ट चित्र बंद हो जाता है। यह विभिन्न संभावनाओं के एक जोड़े की अनुमति देता है:

1-आप यह सुनिश्चित कर सकते हैं कि जहां से आप कभी भी भागते हैं docker-compose, आप हमेशा उस विशिष्ट छवि के नवीनतम संस्करण का उपयोग करेंगे।

2- आप अपनी docker-composeफ़ाइल में कई नामांकित चित्र निर्दिष्ट कर सकते हैं और उन्हें पिछले बिल्ड चरण के माध्यम से ऑटो-वायर्ड कर सकते हैं ।

इसलिए, यदि आपकी छवि पहले से ही निर्मित है, तो आप छवि को नाम दे सकते हैं docker-compose। निकालें buildऔर निर्दिष्ट करेंimage:

wildfly:
  image: my_custom_wildfly_image
  container_name: wildfly_server
  ports:
   - 9990:9990
   - 80:8080
  environment:
   - MYSQL_HOST=mysql_server
   - MONGO_HOST=mongo_server
   - ELASTIC_HOST=elasticsearch_server
  volumes:
   - /Volumes/CaseSensitive/development/wildfly/deployments/:/opt/jboss/wildfly/standalone/deployments/
  links:
   - mysql:mysql_server
   - mongo:mongo_server
   - elasticsearch:elasticsearch_server

10

अपनी छवि बनाने के बाद आप निम्न कार्य करें:

docker tag <image id> mynewtag:version

उसके बाद आप देखेंगे कि आपकी छवि अब आपके नाम <none>पर नहीं है docker images


3
क्या डॉक-कंपोज़ के साथ टैग निर्दिष्ट करना संभव है?
रॉबर्ट

टैग इस समय समर्थित नहीं लगते हैं।
GHETTO.CHiLD

1
इसलिए मुझे छवि बनानी होगी और बाद में इसे फिर से टैग करना होगा? क्या वास्तव में उपयोगी नहीं है, मुझे आशा है कि डॉकटर-रचना इस समस्या को जल्दी से ठीक कर देगी?
रॉबर्ट

1
यदि आप एक बहु कंटेनर वातावरण का निर्माण कर रहे हैं तो हाँ। यदि आप एक एकल कंटेनर वातावरण का निर्माण कर रहे हैं तो आप हमेशा जा सकते हैंdocker build -t mytag:version .
GHETTO.CHiLD
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.