docker-container php 설치 - Docker 컨테이너에서 호스트로 파일 복사





7 Answers

"볼륨"을 마운트하고 아티팩트를 복사합니다.

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 디렉토리로 이미 복사됩니다.

편집하다:

경고 : 이렇게하면 현재 실행중인 사용자의 사용자 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
도커 dockerfile 폴더

Docker를 사용하여 CI (Continuous Integration) 서버에 대한 의존성을 구축 할 생각이므로 모든 런타임과 라이브러리를 에이전트 자체에 설치할 필요가 없습니다. 이 작업을 수행하려면 컨테이너 내부에 구축 된 빌드 아티팩트를 다시 호스트로 복사해야합니다.

그게 가능하니?




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 호스트 볼륨으로 docker run 하고, 아티팩트를 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

이 트릭은 heredoc 내에서 chown 호출이 실행중인 컨테이너 외부에서 $(id -u):$(id -g) 값을 사용하기 때문에 작동합니다. 즉, 도커 호스트.

docker cp 대한 이점은 다음과 같습니다.

  • docker run --name 필요가 없습니다. 전에 컨테이너 이름을 지정하십시오.
  • 당신은 후에 docker container rmdocker container rm 시킬 필요가 없다.



docker run 을 사용할 필요가 없습니다.

docker create 수 있습니다. docker create

The docs from docker create 명령은 지정된 이미지 위에 쓰기 가능한 컨테이너 레이어를 만들고 지정된 명령을 실행하기 위해 준비합니다. 컨테이너 ID는 STDOUT에 인쇄됩니다. 이는 컨테이너가 시작되지 않는다는 점을 제외하면 run-dock과 유사합니다.

그래서, 당신은 할 수 있습니다.

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

여기에서는 컨테이너를 절대 시작하지 않습니다. 그것은 나에게 유익 해 보였다.




대부분의 답변은 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 -d -v hostpath:dockerimag



호스트 시스템 (컨테이너 외부)에 데이터 디렉토리를 작성하고이를 컨테이너 내부에서 볼 수있는 디렉토리에 마운트하십시오. 이렇게하면 파일이 호스트 시스템의 알려진 위치에 저장되므로 호스트 시스템의 도구와 응용 프로그램이 파일에 쉽게 액세스 할 수 있습니다

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





Related