답변:
다음 명령을 사용하여 이미지에서 파일을 추출 할 수 있습니다.
docker create $image # returns container ID
docker cp $container_id:$source_path $destination_path
docker rm $container_id
docker create
documentation 에 따르면 컨테이너를 실행하지 않습니다.
docker create
명령은 지정된 이미지 위에 기록 가능한 콘테이너 층을 생성하고, 지정된 명령을 실행을 위해 준비. 그런 다음 컨테이너 ID가에 인쇄됩니다STDOUT
.docker run -d
컨테이너가 시작되지 않았다는 점 을 제외하고 는 비슷합니다 . 그런 다음docker start <container_id>
명령을 사용하여 언제든지 컨테이너를 시작할 수 있습니다 .
참고로 (이전 답변) 이미지에서 파일을 추출하는 덜 효율적인 방법은 다음과 같습니다.
docker run some_image cat $file_path > $output_path
docker run --entrypoint /bin/sh my_image -c /bin/cat some_file
위의 어느 것도 나를 위해 일하지 않았습니다. 완전한 작업 명령은 다음과 같습니다.
docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename
따옴표 cat
없이는 파일 이름없이 전달되므로 표시 할 내용을 모릅니다. 또한 명령이 완료된 후 컨테이너를 삭제하는 것이 좋습니다.
내가 실수하지 않으면, docker 컨테이너는 Ubuntu의 다음 디렉토리에 생성 된 캐시 파일을 저장한다고 생각합니다.
/var/lib/docker/aufs/diff/<container_id>
거기에서 파일 시스템에 액세스하고 파일을 검색 할 수 있어야합니다.
layersize
and 만 포함 되며 json
사용자가 도커 그룹에 있더라도 사용자가 읽을 수 없습니다. /var/lib/docker/aufs/diff
내가 찾은 파일 (컨테이너 ID별로 분류되지 않음)을 포함하고 읽을 수 없습니다.
/var/lib/docker/aufs
(그러나 다른 모든 디렉토리는 아닙니다)/var/lib/docker/
아님)
전체 출력을 저장하는 docker save
것이 옵션이 아닌 경우 파이프 라인을 사용하여 필요한 파일 만 추출 할 수 있습니다.
불행히도, 출력은 "tars tar"이기 때문에 약간 반복적 인 프로세스가 될 수 있습니다.
지금 파일을 추출해야 할 때 내가 한 일은 다음과 같습니다.
1) 가장 최근에 변경하려는 파일의 이미지 버전 (이 작업을 수행하는 방법은 이미지에 따라 다름)과 파일을 만들거나 저장 한 날짜를 결정하십시오.
2) 다음을 사용하여 docker save
명령 출력에서 전체 목차를 가져옵니다 .
docker save IMAGE_NAME | tar -tvf -
3) layer.tar
1 단계에서 결정한 이미지의 날짜와 일치하는 해당 명령의 출력에서 파일을 수정하십시오.| grep layer.tar
파일을 표시하기 위해 있음).
4) 해당 layer.tar
파일을 표준 출력으로 추출하고 목차를 가져옵니다.
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -tvf -
5) 원하는 파일이 나열되어 있는지 확인하고 이름을 찾으면 추출하십시오.
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - PATH/TO/YOUR/FILE
둘 이상이있는 경우 layer.tar
2/3 단계에서 찾고있는 날짜와 일치하는 파일 경우 올바른 파일을 찾을 때까지 각 파일에 대해 4 단계를 반복해야 할 수도 있습니다.
위 명령에서 대문자로 된 텍스트를 올바른 이미지 이름, 체크섬 및 파일 이름으로 바꾸십시오.