이미지를 실행하지 않고 Docker 이미지에서 파일을 추출하고 싶습니다.
이 docker save
옵션은 특정 파일의 압축을 풀기에는 너무 큰 파일을 저장하므로 현재 나에게는 실행 가능한 옵션이 아닙니다.
답변1
다음 명령을 사용하여 이미지에서 파일을 추출할 수 있습니다.
container_id=$(docker create "$image")
docker cp "$container_id:$source_path" "$destination_path"
docker rm "$container_id"
~에 따르면docker create
문서, 컨테이너를 실행하지 않습니다.
이
docker create
명령은 지정된 이미지에 쓰기 가능한 컨테이너 레이어를 생성하고 지정된 명령을 실행할 수 있도록 준비합니다. 그러면 컨테이너 ID가 에 인쇄됩니다STDOUT
. 이는docker run -d
컨테이너가 시작되지 않은 경우와 유사합니다. 그러면docker start <container_id>
언제든지 이 명령을 사용하여 컨테이너를 시작할 수 있습니다 .
참고로 (이전 답변) 이미지에서 파일을 추출하는 덜 효율적인 방법은 다음과 같습니다.
docker run some_image cat "$file_path" > "$output_path"
답변2
docker save
전체 출력을 저장할 수 없는 경우 파이프를 사용하여 필요한 파일을 추출할 수 있습니다.
불행히도 출력은 "tar of tars"이므로 약간 반복적인 프로세스가 될 수 있습니다.
지금 파일을 추출해야 할 때 내가 한 일은 다음과 같습니다.
관심 있는 파일의 가장 최근에 변경된 이미지 버전(이 작업을 수행하는 방법은 이미지에 따라 다를 수 있음) 및 생성/저장 날짜를 확인합니다.
다음 명령을 사용하여 명령 출력에서 전체 디렉터리를 가져옵니다
docker save
.도커 저장 IMAGE_NAME |tar-tvf-
layer.tar
이 명령의 출력에서 1단계에서 결정한 이미지 날짜와 일치하는 파일을 찾습니다. (| grep layer.tar
이 파일만 표시하도록 추가할 수 있습니다)파일을
layer.tar
표준 출력으로 추출하고 해당 디렉터리를 가져옵니다.도커 저장 IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar -tvf-
원하는 파일이 나열되어 있는지 확인하고 이름을 찾으면 압축을 풉니다.
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | 문서
2/3단계에서 찾고 있는 날짜와 일치하는 파일이 여러 개 있는 경우 layer.tar
올바른 파일을 찾을 때까지 각 파일에 대해 4단계를 반복해야 할 수도 있습니다.
위 명령의 대문자 텍스트를 상황에 맞는 올바른 이미지 이름, 체크섬 및 파일 이름으로 바꾸십시오.
답변3
위의 어느 것도 나에게 적합하지 않습니다. 전체 작업 명령은 다음과 같습니다.
docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename
따옴표 없이 파일 이름을 cat
전달하지 않으므로 무엇을 표시할지 알 수 없습니다. 또한 명령이 완료된 후 컨테이너를 삭제하는 것이 좋습니다.
답변4
컨테이너를 생성하지도 않고 수동으로 레이어를 조작하지 않아도 되는 또 다른 옵션은 다음과 같습니다. 하지만 여러 레이어에 관심 있는 일부 파일이 포함되어 있는 경우 흥미로울 수 있습니다.
$ docker image save IMAGE_NAME | tar --extract --wildcards --to-stdout '*/layer.tar' | tar --extract --ignore-zeros --verbose FILE_OR_DIRECTORY