도커 이미지에서 파일을 추출 하시겠습니까?


24

이미지를 실행하지 않고 Docker 이미지에서 파일을 추출하고 싶습니다.

docker save옵션은 특정 파일의 압축을 풀기 위해 너무 큰 파일을 저장하기 때문에 현재로서는 실용적인 옵션이 아닙니다.


어떤 배포판을 사용하고 있습니까?
ryekayo

@ryekayo : 우분투 14, 도커 1.12.4 (api 1.24)
BlakBat

답변:


21

다음 명령을 사용하여 이미지에서 파일을 추출 할 수 있습니다.

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

3
진입 점을 무시할 수 있습니다. docker run --entrypoint /bin/sh my_image -c /bin/cat some_file
Andrew

1
이것은 이미지를 실행하는데, 특히 내 질문에 명시된대로하고 싶지 않은 것입니다.
BlakBat

아, 좋은 지적입니다. 현재 답변이 만족스럽지 않다는 데 동의합니다.
bbc

1
@BlakBat이 업데이트 된 답변이 효과가 있습니까? 새 답변을 만들어야했지만 지금 끝났습니다.
bbc

1
@bbc이 업데이트 된 답변은 실제로 컨테이너 (질문의 요점)를 시작하지 않으며 루트 일 필요는 없습니다.
BlakBat

2

위의 어느 것도 나를 위해 일하지 않았습니다. 완전한 작업 명령은 다음과 같습니다.

docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename

따옴표 cat없이는 파일 이름없이 전달되므로 표시 할 내용을 모릅니다. 또한 명령이 완료된 후 컨테이너를 삭제하는 것이 좋습니다.


당신이 말하는 명령은 도커와 Dockerfile에서 ENTRYPOINT / CMD가 얼마나 올바르게 설정되었는지에 따라 작동합니다. 이것은 인용과 관련이 없습니다. 컨테이너를 삭제하라고 말하지만 --rm을 지정합니다. 마지막으로, 내 질문을 게시했을 때 "이미지를 실행할 필요없이"를 지정했지만이를 고려한 해결책은 없었습니다.
BlakBat

1
Dockerfile에 설정된 CMD와 ENTRYPOINT에 관계없이 둘 다 재정의하므로 항상 Linux에서 작동합니다. "도커에 따라"라는 것은 무엇을 의미합니까? 설정, 버전, 환경, 무엇? 이미지를 실행할 수 없으므로 컨테이너 만 할 수 있기 때문에 질문이 맞지 않습니다. 나는 정답이 없다고 생각합니다. 많은 파일을 처리하거나 임시 컨테이너를 만들어야합니다. --rm은 임시 컨테이너를 제거하고 다른 답변은 디스크에 약간의 정크를 남깁니다.
sekrett

1

내가 실수하지 않으면, docker 컨테이너는 Ubuntu의 다음 디렉토리에 생성 된 캐시 파일을 저장한다고 생각합니다.

/var/lib/docker/aufs/diff/<container_id>

거기에서 파일 시스템에 액세스하고 파일을 검색 할 수 있어야합니다.


아니. 해당 디렉토리에는 layersizeand 만 포함 되며 json사용자가 도커 그룹에 있더라도 사용자가 읽을 수 없습니다. /var/lib/docker/aufs/diff내가 찾은 파일 (컨테이너 ID별로 분류되지 않음)을 포함하고 읽을 수 없습니다.
BlakBat

몇 가지만 주시면 찾아 보겠습니다. 컨테이너에 들어가거나 실행하지 않고 파일을 검색하는 방법이 있다는 것을 알고 있습니다.
ryekayo

읽을 수 없으므로 어떻게 표시됩니까? 난 당신는 / var / lib / 고정 표시기 / AUFS / DIFF / * 디렉토리로 이동하여 컨테이너에서 텍스트 파일을 풀 수있는 예를 발견했다
ryekayo

내 실수. 사용자는 액세스 할 수 있습니다 /var/lib/docker/aufs(그러나 다른 모든 디렉토리는 아닙니다)/var/lib/docker/ 아님)
BlakBat

루트로 액세스 할 수 있습니까?
ryekayo

0

전체 출력을 저장하는 docker save것이 옵션이 아닌 경우 파이프 라인을 사용하여 필요한 파일 만 추출 할 수 있습니다.

불행히도, 출력은 "tars tar"이기 때문에 약간 반복적 인 프로세스가 될 수 있습니다.

지금 파일을 추출해야 할 때 내가 한 일은 다음과 같습니다.

1) 가장 최근에 변경하려는 파일의 이미지 버전 (이 작업을 수행하는 방법은 이미지에 따라 다름)과 파일을 만들거나 저장 한 날짜를 결정하십시오.

2) 다음을 사용하여 docker save명령 출력에서 전체 목차를 가져옵니다 .

docker save IMAGE_NAME | tar -tvf -

3) layer.tar1 단계에서 결정한 이미지의 날짜와 일치하는 해당 명령의 출력에서 ​​파일을 수정하십시오.| 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.tar2/3 단계에서 찾고있는 날짜와 일치하는 파일 경우 올바른 파일을 찾을 때까지 각 파일에 대해 4 단계를 반복해야 할 수도 있습니다.

위 명령에서 대문자로 된 텍스트를 올바른 이미지 이름, 체크섬 및 파일 이름으로 바꾸십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.