Docker 컨테이너에서 호스트로 파일 복사
에이전트 자체에 모든 런타임 및 라이브러리를 설치할 필요가 없도록 Docker를 사용하여 CI(Continuous Integration) 서버에 종속성을 구축하려고 합니다.
이를 위해 컨테이너 내부에 구축된 빌드 아티팩트를 호스트로 다시 복사해야 합니다.그게 가능한가요?
컨테이너에서 호스트로 파일을 복사하려면 다음 명령을 사용합니다.
docker cp <containerId>:/file/path/within/container /host/path/target
다음은 예입니다.
$ sudo docker cp goofy_roentgen:/out_read.jpg .
여기서 goofy_roentgen은 다음 명령에서 얻은 컨테이너 이름입니다.
$ 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
컨테이너 ID를 사용할 수도 있습니다.다음 명령은 첫 번째 명령과 동일합니다.
$ sudo docker cp 1b4a:/out_read.jpg .
당신은 필요없다니습가사를 사용할 .docker run.
있다니습으로 하면 됩니다.docker create.
문서에서:
그
docker create명령은 지정된 이미지 위에 쓰기 가능한 컨테이너 계층을 생성하고 지정된 명령을 실행할 수 있도록 준비합니다.는 그런다가너컨이다니인됩쇄테음가로 됩니다.STDOUT은 이는다비슷다니합과와 .docker run -d용기가 시작되지 않는 경우를 제외하고는.
따라서 다음을 수행할 수 있습니다.
docker create --name dummy IMAGE_NAME
docker cp dummy:/path/to/file /dest/to/file
docker rm -f dummy
여기서는 용기를 시작하지 않습니다.그것은 저에게 유익해 보였습니다.
볼륨을 마운트하고 아티팩트를 여기에 복사합니다.
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호스트의 디렉토리입니다.
편집
주의: 이 작업을 수행할 때 도커 사용자의 사용자 ID가 현재 실행 중인 사용자의 사용자 ID와 일치하는 문제가 발생할 수 있습니다.즉, 의 파일이/artifacts도커 컨테이너 내부에서 사용되는 사용자의 UID를 가진 사용자 소유로 표시됩니다.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
docker cp containerId:source_path destination_path
는 containerId 명령에서 수 .docker ps -a
원본 경로는 절대 경로여야 합니다.예를 들어, 애플리케이션/서비스 디렉토리가 도커 컨테이너의 앱에서 시작하는 경우 경로는 /app/some_directory/file이 됩니다.
예: 도커 cp d86844abc129:/app/server/output/server-test.png C:/사용자/누군가/데스크톱/출력
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세습법상의 발동.$(id -u):$(id -g)실행 중인 컨테이너 외부의 값, 즉 도커 호스트.
이점은 다음과 같습니다.
- 그럴 가 없어요.
docker container run --name또는docker container create --name이전에 - 그럴 가 없어요.
docker container rm
도커 컨테이너에서 로컬 컴퓨터로
$docker cp containerId:/sourceFilePath/someFile.txt C:/localMachineDestinationFolder
로컬 컴퓨터에서 도커 컨테이너로
$docker cp C:/localMachineSourceFolder/someFile.txt containerId:/containerDestinationFolder
볼륨 마운트, 아티팩트 복사, 소유자 ID 및 그룹 ID 조정:
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 -g)
chown -R $(id -u):$(id -g) /mnt/artifacts
COMMANDS
" " " 와 같은 .$(id -u)백슬래시되므로 컨테이너 내에서 처리되고 백슬래시되지 않은 명령은 명령이 컨테이너로 전송되기 전에 호스트 시스템에서 실행 중인 셸에 의해 처리됩니다.
대부분의 답변은 컨테이너가 다음 이전에 실행되어야 한다는 것을 의미하지 않습니다.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
실행 중인 컨테이너가 없고 이미지만 있고 텍스트 파일만 복사하려는 경우 다음과 같은 작업을 수행할 수 있습니다.
docker run the-image cat path/to/container/file.txt > path/to/host/file.txt
Docker 19.03 릴리스에서는 컨테이너 생성을 건너뛰고 이미지 작성도 생략할 수 있습니다.BuildKit 기반 빌드에는 출력 대상을 변경하는 옵션이 있습니다.이를 통해 빌드 결과를 이미지가 아닌 로컬 디렉토리에 쓸 수 있습니다.예를 들어, 바둑 바이너리의 빌드는 다음과 같습니다.
$ 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내보낼 파일만 포함하는 단계입니다. 새로 된 그고새소로것들은된개리▁and.--outputflag를 사용하면 이미지 대신 로컬 디렉터리에 쓸 수 있습니다.은 1919.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플래그는 업스트림 BuildKit repo에 문서화되어 있습니다. https://github.com/moby/buildkit#output
MySQL 컨테이너로 이 작업을 수행하고 볼륨을 컴퓨터에 로컬로 저장하려는 모든 사용자에게 적합합니다.저는 이 질문에 대한 상위 응답에 제공된 구문을 사용했습니다.하지만 MySQL과 관련된 특정 경로를 사용해야 했습니다.
docker cp containerIdHere:/var/lib/mysql pathToYourLocalMachineHere
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH컨테이너에서 호스트 시스템으로 복사합니다.
예docker cp test:/opt/file1 /etc/
반대의 경우:
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH호스트 시스템에서 컨테이너로 복사합니다.
Mac용 도커를 사용하는 모든 사용자를 위해 이 글을 올립니다.이것이 저에게 도움이 되었습니다.
$ mkdir mybackup # local directory on Mac
$ docker run --rm --volumes-from <containerid> \
-v `pwd`/mybackup:/backup \
busybox \
cp /data/mydata.txt /backup
다음을 사용하여 마운트할 때 주의하십시오.-v 그거backup디렉토리가 자동으로 생성됩니다.
나는 언젠가 이것이 누군가에게 유용하기를 바랍니다.:)
또 다른 좋은 옵션은 먼저 컨테이너를 빌드한 다음 셸 인터프리터와 함께 -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를 사용하면 명령을 매개 변수로 사용할 수 있으며 이 명령은 사용자의 숙제 파일을 컨테이너 경로에 복사합니다.
이 추가 답변이 당신에게 도움이 되기를 바랍니다.
docker run -dit --rm IMAGE
docker cp CONTAINER:SRC_PATH DEST_PATH
https://docs.docker.com/engine/reference/commandline/run/ https://docs.docker.com/engine/reference/commandline/cp/
이 명령에는 PowerShell(Admin)을 사용했습니다.
docker cp {container id}:{container path}/error.html C:\\error.html
예
docker cp ff3a6608467d:/var/www/app/error.html C:\\error.html
sudo docker cp <running_container_id>:<full_file_path_in_container> <path_on_local_machine>
예:
sudo docker cp d8a17dfc455f:/tests/reports /home/acbcb/Documents/abc
실행 중인 컨테이너 대신 이미지에서 파일을 끌어오려는 경우 다음 작업을 수행할 수 있습니다.
docker run --rm <image> cat <source> > <local_dest>
그러면 컨테이너가 표시되고 새 파일을 쓴 다음 컨테이너를 제거합니다.그러나 한 가지 단점은 파일 권한과 수정된 날짜가 보존되지 않는다는 것입니다.
보다 일반적인 솔루션으로는 Jenkins가 Docker 컨테이너 안에 구축할 수 있는 CloudBees 플러그인이 있습니다.도커 레지스트리에서 사용할 이미지를 선택하거나 빌드 및 사용할 도커 파일을 정의할 수 있습니다.
그러면 워크스페이스가 적절한 사용자와 함께 볼륨으로 컨테이너에 마운트되고, 작업 디렉토리로 설정되며, 요청한 모든 명령을 수행합니다(컨테이너 내부).image.inside() {} 명령을 사용하여 도커 워크플로 플러그인(UI보다 코드를 선호하는 경우)을 사용하여 이 작업을 수행할 수도 있습니다.
기본적으로 이 모든 것을 CI/CD 서버에 굽고 일부만 굽습니다.
가장 쉬운 방법은 컨테이너를 만들고 ID를 가져온 다음 거기서 복사하는 것입니다.
IMAGE_TAG=my-image-tag
container=$(docker create ${IMAGE_TAG})
docker cp ${container}:/src-path ./dst-path/
호스트 시스템(컨테이너 외부)에 데이터 디렉토리를 만들고 이 디렉토리를 컨테이너 내부에서 볼 수 있는 디렉토리에 마운트합니다.이렇게 하면 파일이 호스트 시스템의 알려진 위치에 배치되고 호스트 시스템의 도구와 애플리케이션이 파일에 쉽게 액세스할 수 있습니다.
docker run -d -v /path/to/Local_host_dir:/path/to/docker_dir docker_image:tag
이 작업은 python과 같은 SDK에서도 수행할 수 있습니다.되어 있는 console)을 을 조회할 수 .docker ps -a이름은 과학자와 형용사(즉, "relaxed_pasteur")의 연결어인 것 같습니다.
해 보세요.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()
도커 cp [OPTIONS] SRC_PATH 컨테이너:DEST_PATH
DEST_PATH는 이전 버전이어야 합니다.
podman/buildah를1 사용하는 경우 컨테이너를 마운트할 수 있으므로 컨테이너에서 호스트로 파일을 복사하는 데 더 큰 유연성을 제공합니다.
이 답변과 같이 컨테이너를 생성한 후
podman create --name dummy IMAGE_NAME
이제 우리는 전체 컨테이너를 장착할 수 있으며,cp거의 되는 유틸리티는 내을복위해거의의 할 수 ./etc/foobar컨테이너에서 (dummy , , , 로/tmp호스트 시스템에 있습니다.이 모든 것은 뿌리 없이 이루어질 수 있습니다.관찰:
$ podman unshare -- bash -c '
mnt=$(podman mount dummy)
cp -R ${mnt}/etc/foobar /tmp
podman umount dummy
'
1. 포드만은 내부적으로 빌드아를 사용하며, 또한 거의 동일한 API를 공유합니다.
작은 파일이 필요하면 이 섹션을 사용할 수 있습니다.
도커 컨테이너 내부
도커 런 -it -p 4122:4122 <dk_아이디>
nc -l -p 4122 < Output.txt
호스트 시스템
nc 127.0.0.1 4122 > Output.txt
에서는 Docker 실행사하여나하폴의더를다용테있니수컨습마를 하여 폴더 수 .bind활자를
예를 들어 도커에서 주피터 노트북 서버를 실행하려는 경우 다음 명령을 사용할 수 있습니다.
docker run -it --mount type=bind,source="$(pwd)/generatedDataLocal",target="/generatedDataInDocker" -p 10000:8888 jupyter/scipy-notebook:2023-02-28
에▁where디source=$(pwd)/generatedDataLocal도커 명령이 실행 중인 현재 디렉터리의 호스트 컴퓨터를 지정합니다./generatedDataLocal단순히 그 아래에 있는 하위 디렉터리입니다.target="/generatedDataInDocker"합니다./generatedDataInDockerDocker 컨테이너 내부에 생성된 디렉토리입니다.
에서 /generatedDataInDocker도커 컨테이너의 디렉토리는 로컬에서 자동으로 액세스할 수 있습니다.$(pwd)/generatedDataLocal디렉토리입니다.반대로, 예를 들어 로컬에 파일을 추가하는 경우$(pwd)/generatedDataLocal디토리렉내액수있할다습니세스에서리디토렉 내에서 수 있습니다./generatedDataInDockerDocker 컨테이너의 디렉터리입니다.
주피터 노트북의 Pandas 데이터 프레임에서 STATA 파일을 생성하는 경우 다음과 같은 예가 있습니다.
df.to_stata('/generatedDataInDocker/myStataFileEx1.dta', version=118)
..그..그..그..그..myStataFileEx1.dta에▁the▁▁within▁file▁be에서 로컬로 할 수 .generatedDataLocal디렉터리(도커 컨테이너 외부).
파일을 복사할 경로를 만든 후 다음을 사용합니다.
docker run -d -v hostpath:dockerimag
언급URL : https://stackoverflow.com/questions/22049212/copying-files-from-docker-container-to-host
'source' 카테고리의 다른 글
| FileNotFoundError: [Errno 2] 해당 파일 또는 디렉터리가 없습니다. (0) | 2023.08.12 |
|---|---|
| 텍스트 영역 내부의 HTML 렌더링 (0) | 2023.08.12 |
| Powershell, xml을 화면으로 출력 (0) | 2023.08.12 |
| 그라데이션 테두리 (0) | 2023.08.12 |
| 호스트에서 도커 컨테이너로 파일을 복사하는 방법은 무엇입니까? (0) | 2023.08.12 |