मैं डॉक कंपोज़ में वॉल्यूम के रूप में एक होस्ट निर्देशिका कैसे माउंट करता हूं


125

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

मेरे पास दो कंटेनर हैं docker-compose.yml:

node:
    build: ./node
    links:
        - redis
    ports:
        - "8080"
    env_file:
        - node-app.env

redis:
    image: redis
    ports:
        - "6379"

मैं अपने nodeऐप के डॉकफाइल में उस बिंदु पर पहुंच गया हूं जहां मैं एक वॉल्यूम जोड़ता हूं, लेकिन मैं होस्ट की डायरेक्टरी को वॉल्यूम में कैसे माउंट करता हूं ताकि मेरे सभी लाइव एडिट कोड में कंटेनर में परिलक्षित हों?

यहाँ मेरा वर्तमान Dockerfile है:

# Set the base image to Ubuntu
FROM    node:boron

# File Author / Maintainer
MAINTAINER Amin Shah Gilani <amin@gilani.me>

# Install nodemon
RUN npm install -g nodemon

# Add a /app volume
VOLUME ["/app"]

# TODO: link the current . to /app

# Define working directory
WORKDIR /app

# Run npm install
RUN npm install

# Expose port
EXPOSE  8080

# Run app using nodemon
CMD ["nodemon", "/app/app.js"]

मेरी परियोजना इस तरह दिखती है:

/
- docker-compose.yml
- node-app.env
- node/
  - app.js
  - Dockerfile.js

जवाबों:


137

उनके प्रलेखन की जाँच करें

इसके लुक से आप अपने डॉकटर-कंपोज़.आईएमएल पर निम्नलिखित कर सकते हैं

volumes:
    - ./:/app

2
कोशिश की, यह काम नहीं किया:Error: Cannot find module '/data/app.js'
अमीन शाह गिलानी

2
प्रतीक्षा करें .. आपका VOLUME और WORKDIR इंगित करता है /app/कि आपका CMD /data
किस

1
वह एक त्रुटि थी! कि पकड़ने के लिए धन्यवाद! फिक्स्ड, और अब मुझे लगता है Error: Cannot find module 'express'मैं अब कुछ चीजों की कोशिश करने जा रहा हूँ।
अमीन शाह गिलानी

3
विंडोज़ कंटेनरों के लिए, आप एक विंडो स्टाइल पथ चाहते हैं, जैसे - .:c:/app(इसने मुझे ऊपर
खींचा

86

कुछ विकल्प हैं

लघु सिंटेक्स

host : guestप्रारूप का उपयोग करके आप निम्न में से कोई भी कर सकते हैं:

volumes:
  # Just specify a path and let the Engine create a volume
  - /var/lib/mysql

  # Specify an absolute path mapping
  - /opt/data:/var/lib/mysql

  # Path on the host, relative to the Compose file
  - ./cache:/tmp/cache

  # User-relative path
  - ~/configs:/etc/configs/:ro

  # Named volume
  - datavolume:/var/lib/mysql

लंबा सिंटेक्स

Docker-compose v3.2 के रूप में आप लंबे सिंटैक्स का उपयोग कर सकते हैं जो अतिरिक्त फ़ील्ड्स के कॉन्फ़िगरेशन को अनुमति देता है जिसे संक्षिप्त रूप में व्यक्त किया जा सकता है जैसे mount type(वॉल्यूम, बाइंड या टैम्पफ़्स) और read_only

version: "3.2"
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - type: volume
        source: mydata
        target: /data
        volume:
          nocopy: true
      - type: bind
        source: ./static
        target: /opt/app/static

networks:
  webnet:

volumes:
  mydata:

की जाँच करें https://docs.docker.com/compose/compose-file/#long-syntax-3 अधिक जानकारी के लिए।


21

यदि आप किसी विशेष होस्ट निर्देशिका ( /disk1/prometheus-dataनिम्नलिखित उदाहरण में) को volumesडॉकर कम्पोज़ YAML फ़ाइल के खंड में एक वॉल्यूम के रूप में माउंट करना चाहते हैं , तो आप इसे नीचे की तरह कर सकते हैं, जैसे:

version: '3'

services:
  prometheus:
    image: prom/prometheus
    volumes:
      - prometheus-data:/prometheus

volumes:
  prometheus-data:
    driver: local
    driver_opts:
      o: bind
      type: none
      device: /disk1/prometheus-data

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

Dockerfile

...
VOLUME ["/prometheus"]
...

refs:


यह काम किया। धन्यवाद। localड्राइवर प्रकार के लिए दस्तावेज कहां है ?
mmell

@mmell प्रलेखन पहला Refs लिंक है ( docs.docker.com/compose/compose-file/#driver ) यह पढ़ता है: निर्दिष्ट करें कि इस वॉल्यूम के लिए किस वॉल्यूम ड्राइवर का उपयोग किया जाना चाहिए। जो भी ड्राइवर डॉक इंजन को उपयोग करने के लिए कॉन्फ़िगर किया गया है, उसके लिए चूक, जो कि ज्यादातर मामलों में हैlocal
Yuci

1
@mmell, आप इस प्रश्न से अधिक विवरण पा सकते हैं: stackoverflow.com/questions/42195334/…
Yuci

आपको सेटिंग कैसे पता चली driver_opts: o: bind type: none?
एमएमएल

1
@mmell मूल रूप से, वे विकल्प ड्राइवर-निर्भर हैं, और localलिनक्स पर अंतर्निहित ड्राइवर लिनक्स माउंट कमांड के समान विकल्पों को स्वीकार करता है: man7.org/linux/man-pages/man8/mount.8.html । आपको कम से अधिक चर्चा पा सकते हैं github.com/moby/moby/issues/19990#issuecomment-248955005 , और stackoverflow.com/questions/35841241/...
Yuci

9

यह दो चीजें थीं:

मैंने इसमें वॉल्यूम जोड़ा docker-compose.yml:

node:
    volumes:
        - ./node:/app

मैंने npm install && nodemon app.jsटुकड़ों को यूनियन फाइल सिस्टम में जोड़ने के CMDकारण टुकड़ों को स्थानांतरित कर दिया RUN, और मेरी मात्रा UFS का हिस्सा नहीं है।

# Set the base image to Ubuntu
FROM    node:boron

# File Author / Maintainer
MAINTAINER Amin Shah Gilani <amin@gilani.me>

# Install nodemon
RUN npm install -g nodemon

# Add a /app volume
VOLUME ["/app"]

# Define working directory
WORKDIR /app

# Expose port
EXPOSE  8080

# Run npm install
CMD npm install && nodemon app.js

2

हम करने के लिए है बनाने के अपने खुद के डोकर मात्रा के साथ मैप किया मेजबान निर्देशिका इससे पहले कि हम उल्लेख में डोकर-compose.yml के रूप में बाहरी

1. शेयर नाम नामित मात्रा

docker volume create --driver local \
    --opt type=none \
    --opt device=/home/mukundhan/share \
    --opt o=bind share

2. इसे अपने डॉकटर-कम्पोज में इस्तेमाल करें

version: "3"

volumes:
  share:
    external: true

services:
  workstation:
    container_name: "workstation"
    image: "ubuntu"
    stdin_open: true
    tty: true
    volumes:
      - share:/share:consistent
      - ./source:/source:consistent
    working_dir: /source
    ipc: host
    privileged: true
    shm_size: '2gb'
  db:
    container_name: "db"
    image: "ubuntu"
    stdin_open: true
    tty: true
    volumes:
      - share:/share:consistent
    working_dir: /source
    ipc: host

इस तरह हम एक ही डायरेक्टरी को विभिन्न कंटेनरों में चलने वाली कई सेवाओं के साथ साझा कर सकते हैं


मुझे ipc: host की आवश्यकता क्यों है?
वाहिद नूरमोफिदी जूल

यह केवल तभी आवश्यक है जब हमें नेटवर्क को होस्ट में ही बाँधने की आवश्यकता है।
मुकुन्दन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.