hub - what is docker




হোকার থেকে ডকার কনটেইনার থেকে ফাইল অনুলিপি করা হচ্ছে (10)

আমি ডকারে একটি অবিচ্ছিন্ন ইন্টিগ্রেশন (সিআই) সার্ভারে আমার নির্ভরতাগুলি তৈরি করার কথা ভাবছি, যাতে এজেন্টগুলিতে সমস্ত রানটাইম এবং লাইব্রেরি ইনস্টল করতে না হয়। এই অর্জনের জন্য আমি হোস্টের মধ্যে কন্টেইনারের ভিতরে নির্মিত বিল্ড আর্টিফেক্টগুলি অনুলিপি করতে হবে।

এটা কি সম্ভব?


tldr;

$ docker run --rm -iv${PWD}:/host-volume my-image sh -s <<EOF
chown $(id -u):$(id -g) my-artifact.tar.xz
cp -a my-artifact.tar.xz /host-volume
EOF

আর ...

হোস্ট ভলিউম দিয়ে docker run , আর্টিফ্যাক্ট chown , হোস্ট হোস্ট ভলিউমের chown :

$ docker build -t my-image - <<EOF
> FROM busybox
> WORKDIR /workdir
> RUN touch foo.txt bar.txt qux.txt
> EOF
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM busybox
 ---> 00f017a8c2a6
Step 2/3 : WORKDIR /workdir
 ---> Using cache
 ---> 36151d97f2c9
Step 3/3 : RUN touch foo.txt bar.txt qux.txt
 ---> Running in a657ed4f5cab
 ---> 4dd197569e44
Removing intermediate container a657ed4f5cab
Successfully built 4dd197569e44

$ docker run --rm -iv${PWD}:/host-volume my-image sh -s <<EOF
chown -v $(id -u):$(id -g) *.txt
cp -va *.txt /host-volume
EOF
changed ownership of '/host-volume/bar.txt' to 10335:11111
changed ownership of '/host-volume/qux.txt' to 10335:11111
changed ownership of '/host-volume/foo.txt' to 10335:11111
'bar.txt' -> '/host-volume/bar.txt'
'foo.txt' -> '/host-volume/foo.txt'
'qux.txt' -> '/host-volume/qux.txt'

$ ls -n
total 0
-rw-r--r-- 1 10335 11111 0 May  7 18:22 bar.txt
-rw-r--r-- 1 10335 11111 0 May  7 18:22 foo.txt
-rw-r--r-- 1 10335 11111 0 May  7 18:22 qux.txt

এই কৌশলটি কাজ করে কারণ chown মধ্যে chown আমন্ত্রণটি $(id -u):$(id -g) চলমান $(id -u):$(id -g) বাইরে থেকে মান গ্রহণ করে; অর্থাৎ, ডকার হোস্ট।

docker cp উপর সুবিধা আছে:

  • আপনি docker run --name করতে হবে না - আগে আপনার ধারক নাম
  • আপনি পরে docker container rm করতে হবে না

আপনার যদি চলমান ধারক, কেবল একটি চিত্র না থাকে এবং আপনি অনুমান করছেন যে আপনি কেবল একটি পাঠ্য ফাইল অনুলিপি করতে চান তবে আপনি এটির মতো কিছু করতে পারেন:

docker run the-image cat path/to/container/file.txt > path/to/host/file.txt

আপনি কেবল একটি চিত্র থেকে একটি ফাইল টেনে আনতে চান (পরিবর্তে চলমান ধারকটির পরিবর্তে) আপনি এটি করতে পারেন:

docker run --rm <image> cat <source> > <local_dest>

এটি কনটেইনারটি আনবে, নতুন ফাইলটি লিখবে, তারপর কন্টেইনারটি সরিয়ে দেবে। তবে একটি ত্রুটি, ফাইল অনুমতি এবং সংশোধিত তারিখ সংরক্ষণ করা হবে না।


আমি এই কমান্ড দিয়ে PowerShell (অ্যাডমিন) ব্যবহৃত।

docker cp {container id}:{container path}/error.html  C:\\error.html

উদাহরণ

docker cp ff3a6608467d:/var/www/app/error.html  C:\\error.html

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

এটি ওয়ার্কস্পেসটিকে ভলিউম হিসাবে (উপযুক্ত ব্যবহারকারীর সাথে) কন্টেনারে মাউন্ট করবে, এটি আপনার কাজের নির্দেশিকা হিসাবে সেট করবে, আপনি যে কোন কমান্ড (কন্টেইনারের ভিতরে) অনুরোধ করবেন। Image.inside () {} কমান্ডের সাহায্যে আপনি এটি করতে ডকার-ওয়ার্কফ্লো প্লাগইন (UI এ কোডটি পছন্দ করেন) ব্যবহার করতে পারেন।

মূলত এই সব, আপনার সিআই / সিডি সার্ভার এবং তারপর কিছু মধ্যে বেকড।


একটি "ভলিউম" মাউন্ট করুন এবং সেখানে হস্তনির্মিত কপি:

mkdir artifacts
docker run -i -v ${PWD}/artifacts:/artifacts ubuntu:14.04 sh << COMMANDS
# ... build software here ...
cp <artifact> /artifacts
# ... copy more artifacts into `/artifacts` ...
COMMANDS

তারপরে যখন বিল্ডটি শেষ হয় এবং ধারক আর চলছে না, তখন এটি ইতিমধ্যেই হস্তনির্মিত থেকে হোস্টের artifacts ডিরেক্টরিতে অনুলিপি করেছে।

সম্পাদনা করুন:

CAVEAT: যখন আপনি এটি করেন, তখন আপনি চলমান ব্যবহারকারীর ব্যবহারকারী আইডি মিলে ডকার ব্যবহারকারীর ব্যবহারকারী আইডি নিয়ে সমস্যাগুলি চালাতে পারেন। অর্থাৎ, /artifacts ফাইলগুলি ব্যবহারকারীর মালিকানাধীন হিসাবে দেখানো হবে যা ব্যবহারকারীর UID, ডকার কন্টেইনারের ভিতরে ব্যবহৃত হয়। এইরকম একটি উপায় কলিং ব্যবহারকারীর ইউআইডি ব্যবহার করতে পারে:

docker run -i -v ${PWD}:/working_dir -w /working_dir -u $(id -u) \
    ubuntu:14.04 sh << COMMANDS
# Since $(id -u) owns /working_dir, you should be okay running commands here
# and having them work. Then copy stuff into /working_dir/artifacts .
COMMANDS

একটি ভলিউম মাউন্ট করুন, আর্টিফেক্টস অনুলিপি করুন, মালিক আইডি এবং গ্রুপ আইডি সামঞ্জস্য করুন:

mkdir artifacts
docker run -i --rm -v ${PWD}/artifacts:/mnt/artifacts centos:6 /bin/bash << COMMANDS
ls -la > /mnt/artifacts/ls.txt
echo Changing owner from \$(id -u):\$(id -g) to $(id -u):$(id -u)
chown -R $(id -u):$(id -u) /mnt/artifacts
COMMANDS

কোনও কন্টেইনার থেকে হোস্টে একটি ফাইল অনুলিপি করার জন্য, আপনি কমান্ড ব্যবহার করতে পারেন

docker cp <containerId>:/file/path/within/container /host/path/target

এখানে একটি উদাহরণ:

[[email protected] scratch]$ sudo docker cp goofy_roentgen:/out_read.jpg .

এখানে goofy_roentgen নামটি আমি নিম্নলিখিত কমান্ড থেকে পেয়েছি:

[[email protected] scratch]$ sudo docker ps
[sudo] password for jalal:
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                            NAMES
1b4ad9311e93        bamos/openface      "/bin/bash"         33 minutes ago      Up 33 minutes       0.0.0.0:8000->8000/tcp, 0.0.0.0:9000->9000/tcp   goofy_roentgen

docker cp কাজ করবে তার আগে উত্তরগুলির বেশিরভাগই বোঝায় না যে কনটেইনারটি অবশ্যই চলবে:

docker build -t IMAGE_TAG .
docker run -d IMAGE_TAG
CONTAINER_ID=$(docker ps -alq)
# If you do not know the exact file name, you'll need to run "ls"
# FILE=$(docker exec CONTAINER_ID sh -c "ls /path/*.zip")
docker cp $CONTAINER_ID:/path/to/file .
docker stop $CONTAINER_ID







file-copying