হোস্টে ডকারের ধারক থেকে ফাইলগুলি অনুলিপি করা হচ্ছে


1703

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

এটি অর্জনের জন্য আমাকে ধারকটির ভিতরে নির্মিত বিল্ড শিল্পকর্মগুলি হোস্টে ফিরে অনুলিপি করতে হবে। এটা কি সম্ভব?


আপনাকে বলছি আমার হ্যাকার পদ্ধতি এখানে পছন্দ করতে পারেন: stackoverflow.com/a/55876794/990618
কলিন lamarre

1
উত্তরগুলির নীচে ডকার অধিনায়কের সঠিক এবং আসল উত্তর।
বার্টসেভিগ

উত্তর:


2937

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

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

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

$ sudo docker cp goofy_roentgen:/out_read.jpg .

এখানে গুফি_রোইন্টজেন হ'ল কনটেইনারটির নামটি আমি নিম্নলিখিত কমান্ড থেকে পেয়েছি:

$ sudo docker ps

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

আপনি ধারক আইডি (অংশ) ব্যবহার করতে পারেন । নিম্নলিখিত আদেশটি প্রথমটির সমতুল্য

$ sudo docker cp 1b4a:/out_read.jpg .

42
এখানে একটি কুশলী পথ যদি আপনি কেবল একটি টেম্প লিনাক্স পরিবেশের জন্য Docker ব্যবহার করছেন আপনার সর্বশেষ ধারক এ পেতে আছে: docker ps -alq
জোশ হাবদাস

37
এই cp কমান্ড কাজ করে যেমন-is পাশাপাশি ডিরেক্টরির গাছ অনুলিপি (ঠিক না একটি একক ফাইল) জন্য।
ইকো

88
ডকারের নতুন সংস্করণগুলিতে আপনি দ্বিপক্ষীয়ভাবে ( হোস্টারে কনটেইনার বা docker cp ...
হোস্টারে

9
আমার docker cp -Lসিমলিংকগুলি অনুলিপি করা দরকার
হ্যারিসন পাওয়ার

24
দ্রষ্টব্য: সিপি কমান্ডটি ব্যবহার করার জন্য ধারকটি চলমান হবে না। যদি আপনার ধারক ক্রমাগত ক্র্যাশ হয়ে যায় তবে কার্যকর।
মার্টারলাক

219

আপনার ব্যবহারের দরকার নেই docker run

আপনি এটি দিয়ে করতে পারেন docker create

ডক্স থেকে :

docker createকমান্ড নিদিষ্ট চিত্রের উপর একটি লেখার যোগ্য ধারক স্তর তৈরি করে এবং নির্দিষ্ট কমান্ড চালানোর জন্য দেয়ঃ। কনটেইনার আইডিটি তখন মুদ্রিত হয় STDOUTdocker run -dকনটেইনারটি আর কখনও শুরু না করা ছাড়া এটির মতো ।

সুতরাং, আপনি এটি করতে পারেন:

docker create -ti --name dummy IMAGE_NAME bash
docker cp dummy:/path/to/file /dest/to/file
docker rm -f dummy

এখানে, আপনি কখনও ধারক শুরু করবেন না। এটি আমার পক্ষে উপকারী বলে মনে হয়েছিল।


19
এটির জন্য আরও বেশি পরিমাণের প্রয়োজন। আপনার যখন কেবল একটি পাত্রে কিছু তৈরি করতে হবে এবং তারপরে ফলাফলগুলি অনুলিপি করতে হবে তখন দুর্দান্ত Great
হনজা কালফাস

4
@ هونজাকালফাস আমি সম্মতি জানাই যে এটি আরও বেশি হওয়া দরকার। আমি ঠিক এই পরে ছিল। আমি এটি ব্যবহার করেছি যাতে আমি পরিচিত পরিবেশ (একটি নির্দিষ্ট সংস্করণে অ্যামাজন লিনাক্স) ব্যবহার করে কিছু বাইনারি ফাইল তৈরি করতে পারি। এমন শেল স্ক্রিপ্ট তৈরি করতে সক্ষম হয়েছিল যা ডকারকে পুরোপুরি তৈরি করেছিল এবং ফলাফলটি বাইনারিটি এটি থেকে সরিয়ে নিয়েছিল! পারফেক্ট।
চিহ্নিত করুন

1
হয় -tiপ্রয়োজন এবং bashপ্রয়োজনীয়?
jII

@ জেআইআই, আমি এটি করেছিলাম কারণ পরবর্তীতে, আমি এতে ডকার চালাচ্ছি। সাধারণ ক্ষেত্রে এটির প্রয়োজন হয় না তবে এটি এখানেও ক্ষতি করে না।
ইশান ভট্ট

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

87

একটি "ভলিউম" মাউন্ট করুন এবং সেখানে নিদর্শনগুলি অনুলিপি করুন:

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হোস্টের ডিরেক্টরিতে অনুলিপি করেছে ।

সম্পাদন করা

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

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

7
আসলে আপনি chownহোস্ট মেশিনে ব্যবহারকারীর আইডি এবং গ্রুপ আইডি মেলে কমান্ডটি ব্যবহার করতে পারেন ।
দিমচানস্কি

@ ফ্রেন্ডর ভলিউম কনফিগারেশন রেফারেন্স দেখুন ডকস.ডকার
কমপোজ

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

এমন কিছু মনে হচ্ছে যা এটির নিজের নিজস্ব প্রশ্ন হতে পারে @ ফ্রেন্ডর
djhaskin987

1
আমি আপনাকে বিয়ার সাথী কিনছি! ধন্যবাদ!
দিমিতর ভুকম্যান

27

একটি ভলিউম মাউন্ট করুন, শৈলীগুলি অনুলিপি করুন, মালিকের আইডি এবং গ্রুপ আইডি সমন্বয় করুন:

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

24

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শৈল্পিক, cpহোস্ট ভলিউম থেকে আর্টফ্যাক্ট সহ:

$ 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মধ্যে আবাহন heredoc লাগে $(id -u):$(id -g)চলমান ধারক বাইরে থেকে মান; অর্থাত্ ডক হোস্ট।

সুবিধাগুলি হ'ল:

  • আপনার আগে docker container run --nameবা docker container create --nameআগে হবে না
  • আপনার docker container rmপরে হবে না

2
cpএবং ভলিউম-ভিত্তিক উত্তরের তুলনা করার জন্য উন্নত । এছাড়াও, idমালিকানা
অর্জনের কৌশলটির জন্য

18

বেশিরভাগ উত্তর ইঙ্গিত দেয় না যে ধারকটি 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

3
বিটিডাব্লু, কনটেইনারটি অবশ্যই চলমান / থামানো উচিত / তা হোস্ট / ভার্চুয়ালাইজেশন-কৌশলটির ধরণের উপর নির্ভর করে । বর্তমান ডক ডকটি বলেছে "কন্টেইনার একটি চলমান বা থামানো ধারক হতে পারে"। স্বীকৃত উত্তরের একটি মন্তব্য সহ এসও-র একাধিক স্থান বলুন "এটি একটি থামানো ধারকটিতেও কাজ করে"। অধীনে Windows Hyper-V, এটা দৃশ্যত হয় প্রয়োজনীয় করার একটি ফাইল কপি করার আগে ধারক বন্ধ
টুলমেকারস্টেভ

কন্টেইনারগুলি বন্ধ হয়ে গেলে অনুলিপিও কাজ করে।
লুক ডাব্লু

17

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

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

7

আমি ম্যাকের জন্য ডকার ব্যবহার করছে এমন যে কোনও ব্যক্তির জন্য এটি পোস্ট করছি। এটিই আমার পক্ষে কাজ করেছে:

 $ mkdir mybackup # local directory on Mac

 $ docker run --rm --volumes-from <containerid> \
    -v `pwd`/mybackup:/backup \  
    busybox \                   
    cp /data/mydata.txt /backup 

মনে রাখবেন যে যখন আমি ব্যবহার মাউন্ট -vযে backupডিরেক্টরির স্বয়ংক্রিয়ভাবে তৈরি করা হয়।

আমি আশা করি এটি কোনও দিন কারও কাজে আসবে। :)


আপনি যদি ডকার-রচনা ব্যবহার করেন, খণ্ডটি 3 থেকে 3 সংস্করণে অবচয় করা হবে।
mulg0r

Mulg0r এর মন্তব্যের জুড়তে, দেখতে stackoverflow.com/a/45495380/199364 - v.3, আপনি একটি স্থান volumesconfig.yml root- এ কমান্ড ভলিউম একাধিক কন্টেনার দ্বারা অ্যাক্সেস করা জন্য।
টুলমেকারস্টেভ

5

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

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

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



5

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

$ ls
Dockerfile  go.mod  main.go

$ cat Dockerfile
FROM golang:1.12-alpine as dev
RUN apk add --no-cache git ca-certificates
RUN adduser -D appuser
WORKDIR /src
COPY . /src/
CMD CGO_ENABLED=0 go build -o app . && ./app

FROM dev as build
RUN CGO_ENABLED=0 go build -o app .
USER appuser
CMD [ "./app" ]

FROM scratch as release
COPY --from=build /etc/passwd /etc/group /etc/
COPY --from=build /src/app /app
USER appuser
CMD [ "/app" ]

FROM scratch as artifact
COPY --from=build /src/app /app

FROM release

উপরের ডকফাইফাইল থেকে, আমি এমন artifactমঞ্চ তৈরি করছি যা কেবলমাত্র আমার রফতানি করতে চাইলে ফাইলগুলি অন্তর্ভুক্ত করে। এবং নতুন পরিচয়--output পতাকাটি আমাকে একটি চিত্রের পরিবর্তে স্থানীয় ডিরেক্টরিতে লিখতে দেয়। এটি 19.03 সহ জাহাজীকরণকারী বিল্ডকিট ইঞ্জিনের সাথে সম্পাদন করা দরকার:

$ DOCKER_BUILDKIT=1 docker build --target artifact --output type=local,dest=. .
[+] Building 43.5s (12/12) FINISHED
 => [internal] load build definition from Dockerfile                                                                              0.7s
 => => transferring dockerfile: 572B                                                                                              0.0s
 => [internal] load .dockerignore                                                                                                 0.5s
 => => transferring context: 2B                                                                                                   0.0s
 => [internal] load metadata for docker.io/library/golang:1.12-alpine                                                             0.9s
 => [dev 1/5] FROM docker.io/library/golang:1.12-alpine@sha256:50deab916cce57a792cd88af3479d127a9ec571692a1a9c22109532c0d0499a0  22.5s
 => => resolve docker.io/library/golang:1.12-alpine@sha256:50deab916cce57a792cd88af3479d127a9ec571692a1a9c22109532c0d0499a0       0.0s
 => => sha256:1ec62c064901392a6722bb47a377c01a381f4482b1ce094b6d28682b6b6279fd 155B / 155B                                        0.3s
 => => sha256:50deab916cce57a792cd88af3479d127a9ec571692a1a9c22109532c0d0499a0 1.65kB / 1.65kB                                    0.0s
 => => sha256:2ecd820bec717ec5a8cdc2a1ae04887ed9b46c996f515abc481cac43a12628da 1.36kB / 1.36kB                                    0.0s
 => => sha256:6a17089e5a3afc489e5b6c118cd46eda66b2d5361f309d8d4b0dcac268a47b13 3.81kB / 3.81kB                                    0.0s
 => => sha256:89d9c30c1d48bac627e5c6cb0d1ed1eec28e7dbdfbcc04712e4c79c0f83faf17 2.79MB / 2.79MB                                    0.6s
 => => sha256:8ef94372a977c02d425f12c8cbda5416e372b7a869a6c2b20342c589dba3eae5 301.72kB / 301.72kB                                0.4s
 => => sha256:025f14a3d97f92c07a07446e7ea8933b86068d00da9e252cf3277e9347b6fe69 125.33MB / 125.33MB                               13.7s
 => => sha256:7047deb9704134ff71c99791be3f6474bb45bc3971dde9257ef9186d7cb156db 125B / 125B                                        0.8s
 => => extracting sha256:89d9c30c1d48bac627e5c6cb0d1ed1eec28e7dbdfbcc04712e4c79c0f83faf17                                         0.2s
 => => extracting sha256:8ef94372a977c02d425f12c8cbda5416e372b7a869a6c2b20342c589dba3eae5                                         0.1s
 => => extracting sha256:1ec62c064901392a6722bb47a377c01a381f4482b1ce094b6d28682b6b6279fd                                         0.0s
 => => extracting sha256:025f14a3d97f92c07a07446e7ea8933b86068d00da9e252cf3277e9347b6fe69                                         5.2s
 => => extracting sha256:7047deb9704134ff71c99791be3f6474bb45bc3971dde9257ef9186d7cb156db                                         0.0s
 => [internal] load build context                                                                                                 0.3s
 => => transferring context: 2.11kB                                                                                               0.0s
 => [dev 2/5] RUN apk add --no-cache git ca-certificates                                                                          3.8s
 => [dev 3/5] RUN adduser -D appuser                                                                                              1.7s
 => [dev 4/5] WORKDIR /src                                                                                                        0.5s
 => [dev 5/5] COPY . /src/                                                                                                        0.4s
 => [build 1/1] RUN CGO_ENABLED=0 go build -o app .                                                                              11.6s
 => [artifact 1/1] COPY --from=build /src/app /app                                                                                0.5s
 => exporting to client                                                                                                           0.1s
 => => copying files 10.00MB                                                                                                      0.1s

বিল্ডটি সম্পূর্ণ হওয়ার পরে appবাইনারি রফতানি করা হয়েছিল:

$ ls
Dockerfile  app  go.mod  main.go

$ ./app
Ready to receive requests on port 8080

ডকারের কাছে --outputতাদের উজানের বিল্ডকিট রেপোতে ডকুমেন্টেড ফ্ল্যাগের অন্যান্য বিকল্প রয়েছে : https://github.com/moby/buildkit#output


স্ট্যান্ডার্ড বিল্ড ক্যাশে আউটপুট দিয়ে তৈরি করার জন্য ব্যবহৃত হয় না, এটি খারাপ
বার্টসেভিগ

@ বার্টসেভিগ বিল্ডকিট একটি ভিন্ন নির্মাতা, একটি ভিন্ন ক্যাশে পরিবেশ ব্যবহার করে। এটি অনেক বেশি ক্যাশে দক্ষ।
বিএমইচ

আপনাকে ধন্যবাদ আমি আমার বিল্ড নোডগুলি উন্নত করব।
burtsevyg

4

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

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

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


4

আমি এই কমান্ডের সাথে পাওয়ারশেল (অ্যাডমিন) ব্যবহার করেছি।

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

উদাহরণ

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

2

আর একটি ভাল বিকল্প হ'ল প্রথমে ধারকটি তৈরি করুন এবং তারপরে শেল ইন্টারপ্রিটারের সাহায্যে -c পতাকা ব্যবহার করে কিছু কমড চালাতে

docker run --rm -i -v <host_path>:<container_path> <mydockerimage> /bin/sh -c "cp -r /tmp/homework/* <container_path>"

উপরের আদেশটি এটি করে:

-i = ইন্টারেক্টিভ মোডে ধারক চালান

--rm = কার্যকর হওয়ার পরে পাত্রে সরিয়ে ফেলা হয়েছে।

-v = আপনার হোস্ট পাথ থেকে ধারক পথ পর্যন্ত ভলিউম হিসাবে একটি ফোল্ডার ভাগ করেছে।

অবশেষে, / bin / sh -c আপনাকে প্যারামিটার হিসাবে একটি কমান্ড প্রবর্তন করতে দেয় এবং সেই আদেশটি আপনার বাড়ির কাজগুলি ফাইলগুলি ধারক পথে অনুলিপি করবে।

আমি আশা করি এই অতিরিক্ত উত্তরটি আপনাকে সহায়তা করতে পারে


1

হোস্ট সিস্টেমে একটি তথ্য ডিরেক্টরি তৈরি করুন (ধারকটির বাইরে) এবং এটি ধারকটির ভিতরে থেকে দৃশ্যমান ডিরেক্টরিতে মাউন্ট করুন। এটি হোস্ট সিস্টেমে ফাইলগুলিকে একটি পরিচিত স্থানে রাখে এবং হোস্ট সিস্টেমের সরঞ্জাম এবং অ্যাপ্লিকেশনগুলির জন্য ফাইলগুলিতে অ্যাক্সেস করা সহজ করে তোলে

docker run -d -v /path/to/Local_host_dir:/path/to/docker_dir docker_image:tag

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

হোস্ট ফোল্ডারে যদি খুব প্রশস্ত অনুমতি থাকে তবে এটি করা যায়?
জিওরজিওসিরোনি

0

এমন একটি পথ তৈরি করুন যেখানে আপনি ফাইলটি অনুলিপি করতে চান এবং তারপরে ব্যবহার করুন:

docker run -d -v hostpath:dockerimag

0

আপনি যদি কেবল একটি ফোল্ডার মাউন্ট করতে চান তবে bindপরিবর্তে আপনি ব্যবহার করতে পারেন volume, কোনও ধারক জন্য বিশেষ সঞ্চয়স্থান তৈরি করবেন না:

  1. ট্যাগ সহ আপনার চিত্রটি তৈরি করুন:

    docker build . -t <image>

  2. আপনার চিত্রটি চালান এবং বর্তমান $ (pwd) ডিরেক্টরিটি যুক্ত করুন যেখানে অ্যাপ.পি সঞ্চয়ী রাখে এবং আপনার ধারকটির ভিতরে এটি / রুট / উদাহরণ / এ ম্যাপ করুন।

    docker run --mount type=bind,source="$(pwd)",target=/root/example/ <image> python app.py


0

এটি এসডিকে উদাহরণস্বরূপ পাইথনতেও করা যেতে পারে। আপনার যদি ইতিমধ্যে একটি ধারক তৈরি করা থাকে তবে আপনি কনসোলের মাধ্যমে নামটি অনুসন্ধান করতে পারেন ( docker ps -a) নামটি কোনও বিজ্ঞানীর বিশেষণ এবং বিশেষণ (যেমন "রিলাক্সড_পাস্টিউর") বলে মনে হচ্ছে।

চেক আউট help(container.get_archive):

Help on method get_archive in module docker.models.containers:

get_archive(path, chunk_size=2097152) method of docker.models.containers.Container instance
    Retrieve a file or folder from the container in the form of a tar
    archive.

    Args:
        path (str): Path to the file or folder to retrieve
        chunk_size (int): The number of bytes returned by each iteration
            of the generator. If ``None``, data will be streamed as it is
            received. Default: 2 MB

    Returns:
        (tuple): First element is a raw tar data stream. Second element is
        a dict containing ``stat`` information on the specified ``path``.

    Raises:
        :py:class:`docker.errors.APIError`
            If the server returns an error.

    Example:

        >>> f = open('./sh_bin.tar', 'wb')
        >>> bits, stat = container.get_archive('/bin/sh')
        >>> print(stat)
        {'name': 'sh', 'size': 1075464, 'mode': 493,
         'mtime': '2018-10-01T15:37:48-07:00', 'linkTarget': ''}
        >>> for chunk in bits:
        ...    f.write(chunk)
        >>> f.close()

সুতরাং এই জাতীয় কিছু ধারকটির নির্দিষ্ট পথ (/ আউটপুট) থেকে আপনার হোস্ট মেশিনে টেনে আনবে এবং ডলারটি আনপ্যাক করবে।

import docker
import os
import tarfile

# Docker client
client = docker.from_env()
#container object
container = client.containers.get("relaxed_pasteur")
#setup tar to write bits to
f = open(os.path.join(os.getcwd(),"output.tar"),"wb")
#get the bits
bits, stat = container.get_archive('/output')
#write the bits
for chunk in bits:
    f.write(chunk)
f.close()
#unpack
tar = tarfile.open("output.tar")
tar.extractall()
tar.close()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.