ডকারে একটি ভলিউম যুক্ত করুন তবে একটি সাব-ফোল্ডার বাদ দিন


209

মনে হচ্ছে আমার হোস্টে আমার কাছে একটি ডকার পাত্র এবং একটি ফোল্ডার রয়েছে /hostFolder। এখন যদি আমি এই ফোল্ডারটিকে ভলিউম হিসাবে ডকারের ধারকটিতে যুক্ত করতে চাই, তবে আমি এটি ব্যবহার ADDকরে Dockerfileবা ভলিউম হিসাবে এটি মাউন্ট করে এটি করতে পারি ।

এ পর্যন্ত সব ঠিকই.

এখন /hostFolderএকটি উপ-ফোল্ডার রয়েছে /hostFolder/subFolder,।

আমি /hostFolderডকার পাত্রে মাউন্ট করতে চাই (যেমনটি কেবল পঠন-লিখন বা পঠন-পাত্তাই নয়, আমার পক্ষে উভয়ই কাজ করে) তবে আমি এটি অন্তর্ভুক্ত করতে চাই না/hostFolder/subFolder । আমি এটি বাদ দিতে চাই এবং আমিও চাই যে ডকারের ধারকটি এই সাব-ফোল্ডারে পরিবর্তন করতে সক্ষম হবে, এটি হোস্টের মধ্যেও পরিবর্তিত হওয়ার পরিণতি ছাড়াই।

এটা কি সম্ভব? যদি তাই হয়, কিভাবে?


2
@ অভিজিৎসরকার এটি খুব গঠনমূলক (কোনও উপায়ে সহায়ক নয়) মন্তব্য নয়।
কানো

1
@ কানো এটি একটি মন্তব্য নয়, উত্তর নয়।
অভিজিৎ সরকার

উত্তর:


396

ডকার-রচনা ব্যবহার করে আমি স্থানীয়ভাবে নোড_মডিউলগুলি ব্যবহার করতে সক্ষম, তবে ডক পাত্রে এটিকে এড়ানোতে নিম্নোক্ত সিনট্যাক্সটি ব্যবহার করে docker-compose.yml

volumes:
   - './angularApp:/opt/app'
   - /opt/app/node_modules/

এর মধ্যে সমস্ত ./angularAppকিছু ম্যাপ করা হয় /opt/appএবং তারপরে আমি আরেকটি মাউন্ট ভলিউম তৈরি করি /opt/app/node_modules/যা এখন খালি ডিরেক্টরি - এমনকি আমার স্থানীয় মেশিনে ./angularApp/node_modulesখালি না থাকলেও ।


3
এটি কাজ করে তবে আমি ধারকাগুলির ভিতরে এই ডায়ারগুলি সরাতে পারি না উদাহরণস্বরূপ: আমার /opt/app/node_modules/একই নামের সাথে অন্য ডিরেক্টরিতে প্রতিস্থাপন করতে হবে। ত্রুটি ঘটে: 'ভলিউম ব্যস্ত'
স্টেপান ইউদিন

32
পিছনে স্ল্যাশ ভুলবেন না! যেমন। / opt / app / node_modules কাজ করে না, এটি ./angularApp/node_modules দ্বারা ওভাররাইট করা হবে
স্টিংস

3
এই কৌশলটি আমার পক্ষে কাজ করত তবে স্ব-একই রচনা ফাইলটির জন্যও আর তা মনে হয় না। এটি যদি অন্যদের জন্য কাজ করা বন্ধ করে দেয় তবে কৌতূহল।
plinehan

7
ধন্যবাদ! তুমি আমার দিন বাঁচিয়েছ! সাধারণ ডকার ব্যবহারের ক্ষেত্রে, কমপোজ নয় এমনটি দেখতে পাবেন: -v $(pwd):/build/ -v /build/node_modules
বোগদান মার্ট

3
আমি দস্তাবেজটি খুঁজে পেয়েছি, ডকস.ডোকার . com / স্টোরেজ / ভলিউমস / ।। If you start a container which creates a new volume, as above, and the container has files or directories in the directory to be mounted (such as /app/ above), the directory’s contents are copied into the volume.
হিরোশি

118

আপনি যদি ডকার-কমপোজ কিন্তু অধ্যবসায়ী দ্বারা উপ-ডিরেক্টরি উপেক্ষা করতে চান তবে আপনি নিম্নলিখিতটি করতে পারেন docker-compose.yml:

volumes:
  node_modules:
services:
  server:
    volumes:
      - .:/app
      - node_modules:/app/node_modules

এটি আপনার বর্তমান ডিরেক্টরিটি একটি ভাগ করা ভলিউম হিসাবে মাউন্ট করবে তবে আপনার স্থানীয় node_modulesডিরেক্টরিটির স্থলে একটি অবিরাম ডকার ভলিউম মাউন্ট করবে । এটি @ কার্নিক্সের উত্তরের অনুরূপ, তবে এটি রানগুলির node_modulesমধ্যে স্থির থাকতে দেয় docker-compose up, সম্ভবত এটি পছন্দসই আচরণ।


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

3
"নোট করুন যে ডকার-কমপেজ ডাউন এই অবিচ্ছিন্ন ভলিউমকে হত্যা করবে।" ম্যাক ভি 17.0.5+ (এবং সম্ভবত পুরানো সংস্করণগুলি) এর জন্য ডকারে এটি সত্য নয়। docker-compose downপাত্রে সরিয়ে ফেলবে, তবে ভলিউমটি অব্যাহত থাকবে যতক্ষণ না আপনি কিছু চালানdocker system prune
BRDaHa

3
যদি কেউ বুঝতে আগ্রহী হয় যে নামক ভলিউমটি ডকার পাত্রে কেনnode_modules: "উপেক্ষা করে" ব্যবহার করে /app/node_modules, এই পোস্টটি দরকারী খুঁজে পেতে পারে যে ডকার একাধিক মাউন্ট প্রকারগুলি কীভাবে পরিচালনা করে?
ইরা

3
আমি জানি না আমি কিছু ভুল করছি কিনা, তবে আমি যদি এটি করি তবে ধারকটি শুরু করুন এবং তারপরে HOST মেশিনে এনপিএম ইনস্টল করুন, এটি কনটেনারের ভিতরে নোড_মডিউলগুলিও পরিবর্তন করে। কেউ কেন এটি করতে চাইবে তা আমি কল্পনা করতে পারি না তবে এখনও আমি একটি পরিষ্কার বিচ্ছিন্নতার সন্ধান করছি।
রেনরা

3
@ রেনার ঠিক একই সমস্যা ছিল, আমার হোস্ট মেশিনটি নিয়মিতভাবে নোড_মডিউলগুলিতে লিখত যদিও আমার নাম ভলিউম ছিল ... সমস্ত ধরণের অসঙ্গতিজনিত সমস্যা তৈরি করেছিল। এটি ঠিক করার জন্য প্রস্তুত হয়েছি এবং পুরো রেপোর পরিবর্তে আমার
এসসিআর

19

একটি ফাইল বাদ দিতে, নিম্নলিখিত ব্যবহার করুন

volumes:
   - /hostFolder:/folder
   - /dev/null:/folder/fileToBeExcluded

6
আমার যা প্রয়োজন তার নিখুঁত সমাধান (হোস্টের কাছে নোড_মডিউলগুলি ম্যাপ না করা কারণ সিমলিংক স্টাফগুলি একটি উইন্ডোজ হোস্টে ভেঙে গেছে)। / Dev / নালটির দিকে ইঙ্গিত করে কোনও কাজ হয়নি, তবে একটি ফাঁকা ডিরেক্টরি তৈরি করে এটিকে ম্যাপিং করা নিখুঁতভাবে কাজ করেছে এবং আমার যে সমস্যাগুলি ছিল তা সমাধান করেছে - এই ধারণার জন্য ধন্যবাদ।
লিয়াম হামমেট

1
এই Mac 18.09.0 জন্য Docker কাজ করে না: Cannot start service xxx: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"rootfs_linux.go:58: mounting \\\"/dev/null\\\" to rootfs \\\"/var/lib/docker/overlay2/d15ed56ad020d408c63a1f6a6365dbb88d5d3b78a4605980d3faa9861102ef21/merged\\\" at [...] unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type। একটি পিছনে স্ল্যাশ যুক্ত করা কোনও উপকারে আসেনি।
ব্লেইস

আমি নিশ্চিত করতে পারি যে এটি ডাবর 18.09.3 এর সাথে উবুন্টু 16.04 এ কোনওভাবেই কাজ করে না।
ডার্ক

এটি আমার পক্ষে কাজ করে না। এটি যা করে তা হ'ল /dev/nullডিভাইস ফাইল হিসাবে ধারকটিতে অনুলিপি করা।
রেডন রোসবারো

1
অনুগ্রহ করে নোট করুন এটি কেবল ফাইলগুলি বাদ দিয়ে কাজ করে! আপনার / dev / নাল একটি ফাইল এবং তাই লক্ষ্য হওয়া উচিত, ত্রুটির বার্তা এই বেশ স্পষ্ট হল: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type। এটি ওপি ঠিক যা খুঁজছিল তা নয়, তবে এটি আমার পক্ষে খুব দরকারী, যেহেতু আমার একটি একক ফাইল বাদ দেওয়ার দরকার ছিল।
অ্যাভিয়াস

13

প্রথমত, ADDডকফাইফিলের নির্দেশাবলী ব্যবহার করে একটি ভলিউম ব্যবহার করা (অন্যথায় যুক্তির মাধ্যমে বা ডকফাইফিলের নির্দেশের মাধ্যমে ) খুব আলাদা । এবং কমান্ড ঠিক সময়ে ফাইল একটি কপি নিতে চালানো হয়। কমান্ড দিয়ে একটি নতুন চিত্র তৈরি করা অবধি এই ফাইলগুলি আপডেট করা হবে না । বিপরীতে, একটি ভলিউম ব্যবহার করে মূলত বলা হচ্ছে "এই ডিরেক্টরিটি ধারক ইমেজে সংরক্ষণ করা উচিত নয়; পরিবর্তে হোস্টে ডিরেক্টরি ব্যবহার করুন"; যখনই কোনও ভলিউমের অভ্যন্তরের কোনও ফাইল পরিবর্তন করা হবে তখন হোস্ট এবং ধারক উভয়ই তা তাৎক্ষণিকভাবে দেখতে পাবেন।-vdocker runVOLUMEADDCOPYdocker builddocker build

আমি বিশ্বাস করি না যে আপনি ভলিউম ব্যবহার করে যা অর্জন করতে পারবেন তা অর্জন করতে পারেন, আপনি যদি এটি করতে চান তবে আপনাকে আপনার ডিরেক্টরি কাঠামোর পুনর্বিবেচনা করতে হবে।

তবে এটি ব্যবহার করে অর্জন করা বেশ সহজ COPY(যা পছন্দ করা উচিত ADD)। আপনি হয় .dockerignoreসাবডিরেক্টরি বাদ দেওয়ার জন্য একটি ফাইল ব্যবহার করতে পারেন , বা আপনি COPYসমস্ত ফাইলের পরে RUN rm blaসাব-ডিরেক্টরিকে অপসারণ করতে একটি করতে পারেন।

মনে রাখবেন যে কোন ফাইল আপনার সাথে ইমেজ যোগ COPYবা ADDমধ্যে অথবা ডাইরেক্টরি আপনি চালাতে নিচের বিল্ড প্রসঙ্গ অর্থাত ভিতরে হতে হবে docker buildনা।


1
প্রতিদিন নতুন কিছু শিখুন :-) বিল্ড কনটেক্সট (হোস্ট নয়) থেকে কপি এবং অ্যাড কাজ করুন। সাবফোল্ডারটি মাস্ক করার জন্য কি কোনও ভলিউম ব্যবহার করা সম্ভব হবে? ওপি / হোস্টফোল্ডার (আমার মনে হয়) মাউন্ট করতে এবং / হোস্টফোল্ডার / সাবফোল্ডারটিকে সংযোগ বিচ্ছিন্ন করতে চায়। যদি প্রত্যেকের জন্য একটি ভলিউম ছিল, তবে কেবল হোস্টফোল্ডারটি 'মাউন্ট' (-v) ছিল, তবে সে কি ধারকটিতে সাবফোল্ডার পরিবর্তনগুলি পৃথক করে দেবে?
গ্রেগ

আমি নিশ্চিত নই, আমি কখনও বাসা বাঁধার চেষ্টা করিনি। আমি নিশ্চিত নই যে এটি একটি ভাল ধারণা, তবে আমাকে এটি সন্ধান করতে হবে।
অ্যাড্রিয়ান মৌআত

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

1
একবার আপনি কোনও ফাইল যুক্ত করলে সেগুলি কিছু স্তরগুলিতে এখনও শেষ হয়। সুতরাং সুরক্ষা সংবেদনশীল বা চিত্রের আকার হ্রাস করা হলে তাদের মুছে ফেলা আপনাকে আড়াল করতে সহায়তা করবে না (কারণ তারা অন্তর্নিহিত স্তরগুলিতে থাকবে)। squashস্তরগুলির বিকল্প রয়েছে । একটি হ'ল github.com/goldmann/docker-squash এবং অন্যটি oc ex dockerbuildওপেনশিফ্ট প্রকল্প থেকে ব্যবহার করছে ।
akostadinov

6

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

volumes:
   - ./angularApp:/opt/app
   - .empty:/opt/app/node_modules/

docker-compose 1.25.0-rc3ফাইল সিনট্যাক্স ভি 3 দিয়ে আমার পক্ষে কাজ করে না ।
thisismydesign

6

ডকার কমান্ড লাইনের সাথে:

docker run \
    --mount type=bind,src=/hostFolder,dst=/containerFolder \
    --mount type=volume,dst=/containerFolder/subFolder \
    ...other-args...

-vবিকল্প ব্যবহার করা হতে পারে (কৃতিত্ব ছিল Bogdan মার্ট ), কিন্তু --mountপরিষ্কার এবং সুপারিশ করা


6

এমন লোকদের ক্ষেত্রেও যে সমস্যাটি ছিল যে নোড_মডিউলগুলি ফোল্ডারটি এখনও আপনার স্থানীয় সিস্টেম থেকে এবং অন্য উপায়ে ওভাররাইট করা হবে

volumes:
  node_modules:
services:
  server:
    volumes:
      - .:/app
      - node_modules:/app/node_modules/

এই সমাধান, Trailing প্রথম বন্ধনীর সঙ্গে হয় /node_modules ফিক্স হওয়ার পর।


0

আপনার মেশিনের ভলিউমে থাকা মাউন্ট ফাইলটি বাদ দিতে, আপনাকে একই ফাইলটিতে একটি ভলিউম বরাদ্দ করে এটিকে ওভাররাইট করতে হবে। আপনার কনফিগারেশন ফাইলে:

services:
  server:
    build : ./Dockerfile
    volumes:
      - .:/app

আপনার মধ্যে ডকফেরাইল একটি উদাহরণ:

# Image Location
FROM node:13.12.0-buster
VOLUME /app/you_overwrite_file
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.