কিভাবে একটি ভলিউম মধ্যে একটি একক ফাইল মাউন্ট


254

আমি একটি পিএইচপি অ্যাপ্লিকেশন ডকারাইজ করার চেষ্টা করছি। ডকফাইলে আমি সংরক্ষণাগারটি ডাউনলোড করি, এটি এক্সট্রাক্ট করি ইত্যাদি

সবকিছু ঠিকঠাক হয়, তবে কোনও নতুন সংস্করণ প্রকাশিত হয়ে গেলে এবং আমি ডকস্পাইলকে আপডেট করি আমাকে অ্যাপ্লিকেশনটি পুনরায় ইনস্টল করতে হবে কারণ কনফিগারেশন.এফপি ওভাররাইট হয়ে গেছে।

সুতরাং আমি ভেবেছিলাম আমি ডাটাবেসটির মতো ফাইলটি একটি ভলিউম হিসাবে মাউন্ট করতে পারি with

আমি এটি দুটি উপায়ে চেষ্টা করেছি, একটি ভলিউম এবং সরাসরি পথ দিয়ে।

Docker-রচনা:

version: '2'
services:
  app:
    build: src
    ports:
      - "8080:80"
    depends_on:
      - mysql
    volumes:
      -  app-conf:/var/www/html/upload
      -  app-conf:/var/www/html/config.php
    environment:
      DB_TYPE: mysql
      DB_MANAGER: MysqlManager

  mysql:
    image: mysql:5.6
    container_name: mysql
    volumes:
      - mysqldata:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD:
      MYSQL_DATABASE:
      MYSQL_USER:
      MYSQL_PASSWORD:

volumes:
  mysqldata:
  app-conf:

ত্রুটির ফলাফল যা:

এবং আমি এটি একটি নির্দিষ্ট পথ দিয়ে মাউন্ট ভলিউম হিসাবে চেষ্টা করেছি।

/src/docker/myapp/upload:/var/www/html/upload
/src/docker/myapp/upload:/var/www/html/config.php

তবে দুটি উপায়ই কাজ করছে না not মাউন্ট করা ভলিউমের সাথে আমি দেখতে পাচ্ছি যে আপলোডটি তৈরি হয়ে গেছে।

কিন্তু তারপরে ব্যর্থ হয়

/var/www/html/config.php caused "কারণ \\" ডিরেক্টরি নয় \\ "\" "

আমি যদি এটি দিয়ে চেষ্টা করি

/src/docker/myapp/upload/config.php:/var/www/html/config.php

ডকার আপলোড ফোল্ডার এবং তারপরে একটি config.php ফোল্ডার তৈরি করে। ফাইল নয়।

বা কনফিগারেশন চালিয়ে যাওয়ার অন্য কোনও উপায় আছে?


আমার ক্ষেত্রে, আমি ধারক / ভলিউম তৈরির আগে একটি খালি ফাইলটিকে "স্পর্শ" করতে সহজ করি। যদি ফাইলটি না থাকে তবে এটি একটি ডিরেক্টরি তৈরি করে।
ফ্রিসফটওয়্যার সার্ভার

উত্তর:


309

টি এল; ডিআর / বিজ্ঞপ্তি:

আপনি যে ফাইলটি মাউন্ট করার চেষ্টা করছেন তার জায়গায় ডিরেক্টরি তৈরি করার অভিজ্ঞতা যদি আপনি পেয়ে থাকেন তবে আপনি সম্ভবত একটি বৈধ এবং পরম পথ সরবরাহ করতে ব্যর্থ হয়েছেন । এটি একটি নীরব এবং বিভ্রান্তিকর ব্যর্থতা মোডের সাথে একটি সাধারণ ভুল।

ফাইল ভলিউমগুলি ডকারে এইভাবে সম্পন্ন করা হয় (পরম পাথ উদাহরণ (এনভ ভেরিয়েবলগুলি ব্যবহার করতে পারে), এবং আপনাকে ফাইলের নাম উল্লেখ করতে হবে):

    volumes:
      - /src/docker/myapp/upload:/var/www/html/upload
      - /src/docker/myapp/upload/config.php:/var/www/html/config.php

আপনি এটি করতে পারেন:

    volumes:
      - ${PWD}/upload:/var/www/html/upload
      - ${PWD}/upload/config.php:/var/www/html/config.php

আপনি যদি /src/docker/myappফোল্ডার থেকে ডকার-রচনাটি ফায়ার করেন


81
আমি যেমন বলেছি, যদি আমি /src/docker/myapp/upload/config.php:/var/www/html/config.php ডকার চেষ্টা করি তবে আপলোড ফোল্ডার এবং তারপরে একটি config.php ফোল্ডার তৈরি করে। ফাইল নয়।
জাকুব জুসকজাক

9
আপনার পোস্টে আপনি অন্যভাবে লিখেছেন। যদি ফাইলটি থাকে তবে এটি ফাইল হিসাবে মাউন্ট করা উচিত।
ব্ল্যাকস্টর্ক

16
এটি কাজ করার জন্য আমাকে একটি নিখুঁত পথ সরবরাহ করতে হয়েছিল। পিডাব্লুডি ব্যবহার করে টিপটি এখানে অনেক সাহায্য করেছে, ধন্যবাদ!
স্টিভ স্মিথ

4
আমার জন্য ফাইলগুলির পরিবর্তে একটি ফোল্ডার তৈরি করা হচ্ছে, তবে আমি মনে করি কারণ সেই ফাইলটি সেই পথে পরে অনুলিপি করা হয়েছে তবে যেভাবে বাঁধাই স্থগিত করা যায়?
ইকেলভিন

18
হোস্ট ডকারে /src/docker/myapp/upload/config.php উপস্থিত না থাকলে একটি ফোল্ডার তৈরি হবে ... আমি যা করছি একটি স্ক্রিপ্ট তৈরি করছে যা ডকার চালানোর আগে খালি ফাইল তৈরি করবে - এটি আদর্শ হবে যদি আমি ডকিকে আমার জন্য এটি সিএমডি লাইন আর্গের মাধ্যমে করার নির্দেশনা দিতে পারি।
ক্যান্সারবেরো

78

আমিও একই রকম সমস্যায় ভুগছিলাম। আমি আমার কনফিগার ফাইলটি আমার ধারকটিতে আমদানি করার চেষ্টা করছিলাম যাতে আমি ছবিটি পুনর্নির্মাণ না করে যতবার দরকার হয় ততবার এটি ঠিক করতে পারি।

আমি বোঝাতে চাইছি যে নীচের কমান্ডটি $(pwd)/config.pyডকার হোস্ট থেকে /root/app/config.pyএকটি ফাইল হিসাবে ধারকটিতে ম্যাপ করবে ।

docker run -v $(pwd)/config.py:/root/app/config.py my_docker_image

তবে এটি সর্বদা config.pyএকটি ফাইল নয়, নামের একটি ডিরেক্টরি তৈরি করে ।

যখন খেই খুঁজছেন, আমি কারণ খুঁজে পাওয়া যায় নি (থেকে এখানে )

আপনি যদি ডকারের হোস্টে এখনও বিদ্যমান না এমন একটি ফাইল বা ডিরেক্টরি বাঁধাই-মাউন্ট করার জন্য -v বা --volume ব্যবহার করেন, -v আপনার জন্য শেষ পয়েন্ট তৈরি করবে। এটি সর্বদা একটি ডিরেক্টরি হিসাবে তৈরি করা হয়

সুতরাং, এটি সর্বদা ডিরেক্টরি হিসাবে তৈরি হয় কারণ আমার ডকার হোস্টটি নেই $(pwd)/config.py

এমনকি আমি ডকার হোস্টে কনফিগার.পিও তৈরি করি। $(pwd)/config.pyশুধু রফতানি /root/app/config.pyনা ওভারটাইর /root/app/config.py


16
আমি শুধু একটি যোগ touch path/to/fileমধ্যে Dockerfileযাতে যখন আমি মাউন্ট এটি এখনও একটি ফাইল (একটি নির্মিত Dir) হবে
দয়া

8
বাম দিকের :পুরো পথ হতে হবে। এটি এইভাবে কাজ করে
sdkks

touchউত্তর ছিল, Dockerfile তারপর আপনার Docker-রচনা ভলিউম মাউন্ট করে একটি ডিরেক্টরি তৈরি ছাড়া সঠিকভাবে কাজ করবেন
ctrlbrk

27

ব্যবহারের মাউন্ট ( --mount) পরিবর্তে ভলিউম ( -v)

আরও তথ্য: https://docs.docker.com/storage/bind-mounts/

উদাহরণ:

ডক হোস্টে /tmp/a.txt বিদ্যমান রয়েছে তা নিশ্চিত করুন

docker run -it --mount type=bind,source=/tmp/a.txt,target=/root/a.txt alpine sh

আপনাকে সাববু ধন্যবাদ, @ জাকুব জুসকাজাক এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, এটাই একমাত্র উত্তর যা প্রশ্নের জবাব দেয়, এবং এটি আমার পক্ষে কাজ করে
Neokyle

2
এটি আসলে প্রশ্নের উত্তর দেয় না। খণ্ডগুলিও কাজ করবে (কারণ সমস্যাটি পরম পথে) in শুধুমাত্র মধ্যে পার্থক্য --mountএবং -vআচরণ যখন ভলিউমের হোস্ট অংশ এখনও বিদ্যমান নয়। আপনার লিঙ্ক অনুসারে:> আপনি যদি ডকার হোস্টে এখনও বিদ্যমান না এমন একটি ফাইল বা ডিরেক্টরি বাঁধতে-মাউন্ট করতে -v বা --volume ব্যবহার করেন, -v আপনার জন্য শেষের অবস্থান তৈরি করে। এটি সর্বদা একটি ডিরেক্টরি হিসাবে তৈরি করা হয়।
গডফাদার

2
আমি কীভাবে এটি ডকার-রচনায় অনুবাদ করতে জানি না। 'ছোট্ট সাহায্য?
মিসানফোর্ড

@ এমএসফোর্ড আমি উত্তরে একটি ডকার-রচনা উদাহরণ যুক্ত করেছি।
sebisnav

10

আমার মতো উইন্ডোজ ধারক ব্যবহারকারী যে কোনও ব্যক্তির জন্য, জেনে রাখুন যে আপনি উইন্ডোজ ধারক ব্যবহার করে একটি ফাইল বাঁধতে বা মাউন্ট করতে পারবেন না।

উইন্ডোজ ভিত্তিক কনটেইনারগুলি ব্যবহার করার সময় নিম্নলিখিত উদাহরণগুলি ব্যর্থ হবে, কারণ ধারকের অভ্যন্তরে ভলিউম বা বাঁধাই মাউন্টের গন্তব্য অবশ্যই একটি হতে হবে: একটি অ-বিদ্যমান বা খালি ডিরেক্টরি; বা সি ছাড়া অন্য কোনও ড্রাইভ:। আরও, বাইন্ড মাউন্টের উত্স অবশ্যই স্থানীয় ডিরেক্টরি হতে হবে, ফাইল নয়

net use z: \\remotemachine\share

docker run -v z:\foo:c:\dest ...

docker run -v \\uncpath\to\directory:c:\dest ...

docker run -v c:\foo\somefile.txt:c:\dest ...

docker run -v c:\foo:c: ...

docker run -v c:\foo:c:\existing-directory-with-contents ...

এটি খুঁজে পাওয়া শক্ত কিন্তু এটি সেখানে

উইন্ডোজ ধারকটিতে ফাইল ম্যাপিং সম্পর্কিত গিথুব ইস্যুটির লিঙ্ক


7

আমার জন্য যেভাবে কাজ করেছে তা হ'ল bindমাউন্ট ব্যবহার করা

  version: "3.7"    
  services:
  app:
    image: app:latest
    volumes:
      - type: bind
        source: ./sourceFile.yaml
        target: /location/targetFile.yaml

উত্তরের জন্য মাইক জাতকে ধন্যবাদ এখানে: ডকার-কমপোজ ব্যবহার করে ভলিউম থেকে একক ফাইল মাউন্ট করুন

bindমাউন্টটি প্রকাশের জন্য আপনাকে "দীর্ঘ সিনট্যাক্স" ব্যবহার করতে হবে : https://docs.docker.com/compose/compose-file/#long-syntax


6

আপনি নিজের docker-compose.ymlফাইলে সম্পর্কিত কোনও পথটি ব্যবহার করতে পারেন (উইন্ডোজ হোস্ট, লিনাক্স ধারকটিতে পরীক্ষিত):

 volumes:
      - ./test.conf:/fluentd/etc/test.conf

1
আমি ডক্কার-রচনা সংস্করণ 1.24.1 সহ ফাইলটিতে version: '3.7'সুনির্দিষ্টভাবে ম্যাকের উপরে এটি পরীক্ষা docker-compose.ymlকরেছি, 4667896 বি তৈরি করেছি এবং এটি কার্যকর হয়েছে।
অ্যাকিউম্যানাস

6
আমি এখনও একটি ফাইলের পরিবর্তে একটি ডিরেক্টরি পাই।
chovy

6

ডকার-কমপোজ ফাইল সংস্করণ ৩.২ হিসাবে আপনি "বাইন্ড" টাইপের একটি ভলিউম মাউন্ট নির্দিষ্ট করতে পারেন (ডিফল্ট টাইপের "ভলিউম" এর পরিবর্তে) যা আপনাকে একটি পাত্রে কোনও একক ফাইল মাউন্ট করতে দেয়। ডকার-কমপোজ ভলিউম ডক্সে "বাইন্ড মাউন্ট" অনুসন্ধান করুন: https://docs.docker.com/compose/compose-file/#volume

আমার ক্ষেত্রে, আমি আমার অ্যাপ্লিকেশনটিতে একটি একক ".সক্রিট" ফাইল মাউন্ট করার চেষ্টা করছিলাম যাতে কেবল স্থানীয় বিকাশ এবং পরীক্ষার জন্য গোপনীয়তা রয়েছে। উত্পাদনে আমার অ্যাপ্লিকেশনটি এডাব্লুএস এর পরিবর্তে এই গোপন বিষয়গুলি আনে।

শর্টহ্যান্ড সিনট্যাক্স ব্যবহার করে যদি আমি এই ফাইলটি একটি ভলিউম হিসাবে মাউন্ট করেছি:

volumes:
 - ./.secrets:/data/app/.secrets

ডকার কনটেইনারটির বাইরে থাকা ফাইলটিতে ম্যাপিংয়ের পরিবর্তে ধারকটির ভিতরে একটি ".সক্রিটস" ডিরেক্টরি তৈরি করবে । আমার কোডটি তখন "ইসএডিরেক্টরিএরআর: [এর্নো 21] একটি ডিরেক্টরি: '.সক্রিটস'" এর মতো একটি ত্রুটি বাড়িয়ে তুলবে।

পরিবর্তে দীর্ঘ-হাতের সিনট্যাক্স ব্যবহার করে এটি ঠিক করেছি, কেবলমাত্র পঠনযোগ্য "বাইন্ড" ভলিউম মাউন্ট ব্যবহার করে আমার গোপনীয়তা ফাইল নির্দিষ্ট করে:

volumes:
 - type: bind
   source: ./.secrets
   target: /data/app/.secrets
   read_only: true

এখন ডকার আমার .সক্রিট ফাইলটি সঠিকভাবে ধারকটিতে স্থাপন করে একটি ডিরেক্টরি পরিবর্তে ধারকটির ভিতরে একটি ফাইল তৈরি করে। আশা করি অন্যরাও এই উদাহরণটিকে সহায়ক বলে মনে করেন!


ধন্যবাদ জনাব! আমার ওয়ার্ডপ্রেস ডাব্লুপি-কনফিগারেশন ফাইলটি (এবং এটি একটি ডিরেক্টরি হিসাবে তৈরি করা বন্ধ করুন) করতে সক্ষম হবার সমাধানটি আমার প্রয়োজন ছিল
জুনো

0

আমার জন্য, সমস্যাটি ছিল যে আমি যে ফাইলটি ধারকটিতে intoোকার চেষ্টা করছিলাম তাতে আমার একটি ভাঙা প্রতীকী লিঙ্ক ছিল


0

উইন্ডোজেও আমার একই সমস্যা ছিল Docker 18.06.1-ce-win73 (19507),।

ডকার সেটিংস প্যানেলের মাধ্যমে ভাগ করা ড্রাইভটি সরিয়ে এবং পুনরায় যুক্ত করা হচ্ছে এবং সবকিছু আবার কাজ করেছে।


0

উইন্ডোগুলিতে, আপনার ডকার-কমপোজ.আইএমএল-তে যদি আপনার একটি $ {PWD} env পরিবর্তনশীল প্রয়োজন হয় তবে আপনি আপনার ডকার-কমপোজ.আইএমএল ফাইলের মতো একই ডিরেক্টরিতে একটি .env ফাইল তৈরি করতে পারেন তারপরে আপনার ফোল্ডারের অবস্থানটি ম্যানুয়ালি sertোকান।

সিএমডি (pwd_var.bat):

echo PWD=%cd% >> .env

পাওয়ারশেল (pwd_var.ps1):

$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'; echo "PWD=$(get-location).path" >> .env

ডকার-কমপোজ .এনভ ভেরিয়েবলের জন্য আরও আরও ভাল বৈশিষ্ট্য শুনতে পাওয়া যায়: https://docs.docker.com/compose/references/envvars/ বিশেষত vভ ভেরিয়েবলের জন্য যা COMPOSE_CONVERT_WINDOWS_PATHSডকর রচনাটিকে বাস্কস্ল্যাশ সহ উইন্ডোজ পাথ গ্রহণ করতে দেয় "\"

আপনি যখন উইন্ডোতে কোনও ফাইল ভাগ করতে চান, তখন ফাইলটি ধারকটির সাথে ভাগ করার আগে উপস্থিত থাকতে হবে।


আপনি ডকারের সাথে পাওয়ারশেল ব্যবহার করতে পারবেন না, এটি একটি বিক্রেতা লক-ইন তৈরি করে এবং সম্প্রদায়ের ক্ষতি করে ...
মেটেজ 'ইয়িন' গ্যাগি

0

হতে পারে এটি কাউকে সহায়তা করে।

আমার এই সমস্যাটি ছিল এবং সবকিছু চেষ্টা করেছিলাম। ভলিউম বাইন্ডিংগুলি ভাল লাগছিল এবং আমি ডিরেক্টরি (ফাইল নয়) মাউন্ট করলেও, আমার কাছে সঠিকভাবে মাউন্ট করা ডিরেক্টরিতে ফাইলের নাম ছিল তবে ডায়ার হিসাবে মাউন্ট করা হয়েছিল।

আমি ভাগ করা ড্রাইভগুলি পুনরায় সক্ষম করার চেষ্টা করেছি এবং ডকার অভিযোগ করেছেন যে ফায়ারওয়াল সক্রিয় রয়েছে।

ফায়ারওয়ালটি অক্ষম করার পরে সমস্ত ঠিকঠাক কাজ করছিল।


এটার জন্য ধন্যবাদ! আপনার পোস্ট আমাকে বুঝতে পেরেছিল যে আমার সেলিনাক্স কার্যকর করার জন্য প্রস্তুত ছিল এবং এটি আমার সমস্ত সমস্যার কারণ হয়ে দাঁড়িয়েছে। কেন তুমি ছিলে নিচে- ভোট কি জান না _ (ツ): _ / ¯
Octavian

0

আপনি ফাইল বা ডিরেক্টরি / ফোল্ডারগুলি মাউন্ট করতে পারেন এটি সমস্ত সোর্স ফাইল বা ডিরেক্টরিতে নির্ভর করে। এবং আপনাকে অবশ্যই পুরো পথ সরবরাহ করতে হবে বা আপনি যদি নিশ্চিত হন না যে আপনি পিডব্লিউডি ব্যবহার করতে পারেন। এখানে একটি সহজ কাজ উদাহরণ।

এই উদাহরণে, আমি এনভি-কমান্ড ফাইলটি মাউন্ট করছি যা আমার ওয়ার্কিং ডিরেক্টরিতে ইতিমধ্যে বিদ্যমান

$ docker run  --rm -it -v ${PWD}/env-commands:/env-commands aravindgv/eosdt:1.0.5 /bin/bash -c "cat /env-commands"

-1

আমার উইন্ডোজ 8.1 এ আমার একই সমস্যা রয়েছে

দেখা গেল যে এটি পথের কেস-সংবেদনশীলতার কারণে। আমি docker-compose upডিরেক্টরি থেকে কল করেছি cd /c/users/alex/এবং ধারকটির ভিতরে একটি ফাইল ডিরেক্টরিতে পরিণত হয়েছিল।

কিন্তু যখন আমি cd /c/Users/alex/(ব্যবহারকারীদের মূলধন নয়) করেছি এবং docker-compose upসেখান থেকে কল করেছি, এটি কার্যকর হয়েছিল।

আমার সিস্টেমে উভয় ব্যবহারকারী দির এবং অ্যালেক্স দির মূলধনযুক্ত, যদিও এটি কেবল ব্যবহারকারীদের মতই মনে হচ্ছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.