কেন ডকফাইলে কাজ ডুবে না?


85

আমার ডকফাইফাইল একটি ডিরেক্টরি তৈরি করে, এটি ছাঁটাই করে এবং তারপরে ডিরেক্টরিটি তালিকাভুক্ত করে। ডিরেক্টরিটি এখনও মূলের মালিকানাধীন। তা কেন?

এখানে ডকফায়াইল:

FROM ubuntu:precise
RUN useradd -d /home/testuser -m -s /bin/bash testuser
RUN mkdir -p /var/local/testrunner/logs
VOLUME ["/var/local/testrunner/logs"]
RUN grep testuser /etc/passwd
RUN grep root /etc/passwd
RUN chown -R testuser:testuser /var/local/testrunner/logs
RUN ls -ld /var/local/testrunner/logs 

এখানে "ডকার বিল্ড" থেকে আউটপুট দেওয়া হচ্ছে:

Sending build context to Docker daemon 10.24 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:precise
 ---> ab8e2728644c
Step 1 : RUN useradd -d /home/testuser -m -s /bin/bash testuser
 ---> Using cache
 ---> 640f12671c86
Step 2 : RUN mkdir -p /var/local/testrunner/logs
 ---> Using cache
 ---> bf7756fd5b1f
Step 3 : VOLUME ["/var/local/testrunner/logs"]
 ---> Using cache
 ---> 65c73ee76c20
Step 4 : RUN grep testuser /etc/passwd
 ---> Using cache
 ---> db72fff0b965
Step 5 : RUN grep root /etc/passwd
 ---> Running in ebff78df7a9a
root:x:0:0:root:/root:/bin/bash
 ---> ead0ff704a59
Removing intermediate container ebff78df7a9a
Step 6 : RUN chown -R testuser:testuser /var/local/testrunner/logs
 ---> Running in c925f67b2ab4
 ---> 253132be935e
Removing intermediate container c925f67b2ab4
Step 7 : RUN ls -ld /var/local/testrunner/logs
 ---> Running in 978bc66aa47e
drwxr-xr-x 2 root staff 4096 Oct  1 15:15 /var/local/testrunner/logs

ডকার সংস্করণ 1.2.0, বিল্ড fa7b24f

হোস্ট উবুন্টু 12.04 চালায় তবে একটি 3.13.0-36-জেনেরিক কার্নেল দিয়ে।


4
সিপিওয়াইয়ের পরে অনার্সশিপ নিয়ে ইস্যুগুলির জন্য দেখুন: stackoverflow.com/questions/44766665/…
সেই ব্রাজিলিয়ান গায়

উত্তর:


127

আমার নিজের প্রশ্নের উত্তর: এটি একটি ভলিউম হিসাবে ঘোষণা করা হয়েছে। আপনি যদি ভলিউম নির্দেশনাটি গ্রহণ করেন তবে তা বন্ধ হয়ে যায়।

আরও কী, আপনি যদি জোতা চালানোর পরে ভলিউমটি ঘোষণা করেন তবে ডুব দেওয়া সেটিংস কার্যকর থাকবে।


18
"যদি আপনি ছোটাছুটি চালানোর পরে ভলিউম ঘোষণা করেন, তবে ডোবার সেটিংস কার্যকর থাকবে" এটি এমন কিছু উত্তর দিয়েছে যা আমাকে দু'দিন ধরে স্ট্যাম্প করে রেখেছিল। ধন্যবাদ!
ক্যাশসক্লে

4
ব্যাখ্যা এখানে আমার ধারণা তৈরি করেছেন: নিজেকে উত্তর container-solutions.com/2014/12/understanding-volumes-docker
মাইকেল Hartl

4
উপরোক্ত নিবন্ধটির একটি গুরুত্বপূর্ণ বিষয়: "[যখন ভলিউমটি সংশোধনকারী VOLUMEকোনও RUNআদেশের পরে নির্দিষ্ট করা হয় ], ডকার ভলিউমে মাউন্টের নিচে চিত্রের মধ্যে থাকা কোনও ফাইল অনুলিপি করে মালিকানা সঠিকভাবে সেট করতে যথেষ্ট চৌকস This 'টি ঘটতে যদি আপনি (যাতে হোস্ট ফাইল ঘটনাক্রমে ওভাররাইট না) ভলিউমের জন্য একটি হোস্ট ডিরেক্টরিতে উল্লেখ করুন। "
Gezim


4
আমি আমার ডক স্পাইলে কোনও ভলিউম ঘোষণা করি না এবং এখনও এই সমস্যাটি রয়েছে ... :-(
fccoelho

8

এই ব্লগ http://container42.com/2014/11/03/docker-indepth-volume/ এই আচরণটি বিশদভাবে ব্যাখ্যা করে।

ডকফাইফিলের প্রতিটি নির্দেশ একটি নতুন ধারক তৈরি করে। নির্দেশিকাটি এই ধারকটিতে কিছু পরিবর্তন করে এবং একটি নতুন স্তরতে পরিণত হয়। সত্যিকারের ধারক ফাইল সিস্টেমে VOLUM নির্দেশ দেওয়ার আগে "/ var / স্থানীয় / টেস্টরুনার / লগগুলি" এ পরিবর্তনগুলি করা হয়। তবে, VOLUME নির্দেশনার পরে, ডিরেক্টরি "/ var / স্থানীয় / টেস্টরুনার / লগস" মাউন্ট করা ডিরেক্টরি। VOLUME নির্দেশের পরে এই ডিরেক্টরিতে করা পরিবর্তনগুলি মাউন্টড ডিরেক্টরিতে প্রয়োগ করা হবে এবং প্রকৃত ধারক ফাইল সিস্টেম নয়।


2

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

সমস্যা:

একটি সাধারণ ডকফাইফাইল সহ নিম্নরূপ:

FROM ubuntu:16.04
RUN useradd -m -d /home/new_user new_user
COPY test_file.txt /home/new_user
RUN chown -R new_user:new_user /home/new_user
CMD ls -RFlag /home

দৌড়ানোর পরে:

echo "A file to test permissions." > test_file.txt
docker build -t chown-test -f Dockerfile .
docker run --rm -it chown-test

আউটপুটটি ছিল:

/home:
total 12
drwxr-xr-x 1 root 4096 Jun 15 21:37 ./
drwxr-xr-x 1 root 4096 Jun 15 21:39 ../
drwxr-xr-x 1 root 4096 Jun 15 21:39 new_user/

/home/new_user:
total 24
drwxr-xr-x 1 root 4096 Jun 15 21:39 ./
drwxr-xr-x 1 root 4096 Jun 15 21:37 ../
-rw-r--r-- 1 root  220 Aug 31  2015 .bash_logout
-rw-r--r-- 1 root 3771 Aug 31  2015 .bashrc
-rw-r--r-- 1 root  655 Jul 12  2019 .profile
-rw-r--r-- 1 root   28 Jun 11 19:48 test_file.txt

আপনি দেখতে পাচ্ছেন যে ফাইলটির মালিকানা (উদাহরণস্বরূপ test_file.txt) এখনও ব্যবহারকারীর সাথে সম্পর্কিত root

সমাধান:

আমি দেখতে পেয়েছি যে আমি যদি chownকমান্ডে একটি সংখ্যাসূচক ইউআইডি ব্যবহার করি তবে আমি মালিকানা পরিবর্তন করতে পারতাম, তবে কেবল যদি ইউআইডি 1000 না হয় So সুতরাং আমি 1 এর ইউআইডিতে যুক্ত করেছি new_userএবং তারপরে মালিকানা পরিবর্তন করেছি।

FROM ubuntu:16.04
RUN useradd -m -d /home/new_user new_user
# change the uid of new_user to ensure it has whatever it was assigned plus 1 (e.g. if UID was 1000, now it'll be 1001)
RUN id -u new_user | awk '{print $1+1}' | xargs -I{} usermod -u {} new_user
COPY test_file.txt /home/new_user
RUN id -u new_user | xargs -I{} chown -R {}:{} /home/new_user
CMD ls -RFlag /home

দৌড়ানোর পরে:

echo "A file to test permissions." > test_file.txt
docker build -t chown-test -f Dockerfile .
docker run --rm -it chown-test

আউটপুটটি ছিল:

/home:
total 12
drwxr-xr-x 1 root 4096 Jun 15 21:37 ./
drwxr-xr-x 1 root 4096 Jun 15 21:37 ../
drwxr-xr-x 1 1001 4096 Jun 15 21:37 new_user/

/home/new_user:
total 24
drwxr-xr-x 1 1001 4096 Jun 15 21:37 ./
drwxr-xr-x 1 root 4096 Jun 15 21:37 ../
-rw-r--r-- 1 1001  220 Aug 31  2015 .bash_logout
-rw-r--r-- 1 1001 3771 Aug 31  2015 .bashrc
-rw-r--r-- 1 1001  655 Jul 12  2019 .profile
-rw-r--r-- 1 1001   28 Jun 11 19:48 test_file.txt

আমি নিশ্চিত না কেন আমি এই সমস্যাটি প্রথম স্থানে নিয়ে এসেছি। যাইহোক, যেহেতু এটি অন্যদের এই সমস্যাটির সাথে দেখা দেয়, তাই আমি ভেবেছিলাম যে আমি আমার কাজটি পোস্ট করব। আমার ব্যবহারের ক্ষেত্রে এমন একটি ডকার পাত্রে তৈরি করা হয়েছিল যা জুপিটার নোটবুক সরবরাহ করেছিল। আমি নোটবুকটি পরিবেশন করতে একটি নন-রুট ব্যবহারকারী তৈরি করেছি।


1

আমার অভিজ্ঞতায়, chownরুট ( VOLUME /test) এ মাউন্ট করার সময় কাজ করে না । একটি মূল ছাড়াই অবস্থান ব্যবহার করুন ( VOLUME /var/test)।


0

জন্য আলপাইন Linux ব্যবহারকারীরা , আমি কি ছিল chown -R root .কর্মক্ষেত্র আমি মালিক করার চেষ্টা ছিল না। এটি CMDডকফাইফিলের মধ্যে সম্পন্ন করতে হয়েছিল , কারণ আমার বিশ্বাস যে ভলিউম মাউন্টগুলি মাউন্ট করার সময় ফাইলগুলিকে ওভাররাইট করতে পারে

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