도커 이미지 내용을 보는 방법


295

도커를 가져 와서 다운로드 한 이미지를 나열 할 수 있습니다. 이 이미지의 내용을보고 싶습니다. 인터넷에서 검색했지만 정답은 없습니다.



10
속이 아닙니다. 컨테이너와 이미지를 보는 것은 동일하지 않습니다. 초기 파일 시스템을 보거나 이미지가 실행되기 전에 이미지 내에 악의적 인 것이 없는지 확인할 수도 있습니다.
Keilaron

4
이미지를 컨테이너로 실행할 수없는 경우 drive ( github.com/wagoodman/dive ) 같은 도구를 사용 하거나 docker save를 사용하여 이미지를 tar 파일로 내보낼 수 있습니다. 그런 다음 타르를 탐색하거나 다이빙을 통해 이미지를 최대한 빨리 탐색 할 수 있습니다.
FunThomas424242

아니 잘 속는 사람하지만 당신은 여기에 대한 답을 찾을 수 있습니다 stackoverflow.com/a/40324326/5641227
칼릴 Gharbaoui

답변:


376

해당 이미지를 사용하여 대화식 쉘 컨테이너를 실행하고 해당 이미지의 컨텐츠를 탐색 할 수 있습니다.

예를 들어 :

docker run -it image_name sh

또는 entrypoint

docker run -it --entrypoint sh image_name

또는 이미지가 어떻게 만들어 졌는지 확인하려면의 단계를 의미합니다 Dockerfile.

docker image history --no-trunc image_name > image_history

단계가 image_history파일에 로그인됩니다 .


1
감사. 첫 번째는 내가 찾고있는 것입니다. 기본적으로 폴더를 탐색하십시오.
pylearn

9
"FROM scratch"를 사용하여 만든 이미지의 내용을 보려고하는데 사용 가능한 셸이 없습니다. 내용을 볼 수있는 다른 방법이 있습니까? 내가 보려고하는 이미지는 portainer / portainer입니다.
Juan Hernandez

2
누군가 컨테이너를 생성하지 않고 이미지의 내용을 볼 수 있습니까? 아니면 컨테이너를 스폰 할 권한이 없다면 모든 것이 안전하다고 가정 할 수 있습니까?
Shabirmean

3
"엔트 포인트가있는 Windows 컨테이너의 경우"에 설명 된 내용을 결합 docker run -it --entrypoint cmd <image_name>하면 작동합니다.
Beytan Kurt

2
@JuanHernandez, 예 . stackoverflow.com/a/42677219/320594에 표시된대로 이미지의 전체 내용을 덤프 할 수 있습니다 .
Jaime Hablutzel

197

여기에 허용되는 대답은 문제가 있습니다. 이미지에 대화 형 쉘이있을 것이라는 보장이 없기 때문입니다. 예를 들어, 무인 항공기 / 무인 항공기의 이미지는 하나의 명령에 포함 /drone, 그것은을 가지고 ENTRYPOINT이 실패합니다, 그래서뿐만 아니라 :

$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured        

그리고 이것은 실패합니다 :

$ docker run --rm -it --entrypoint sh drone/drone
docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"sh\": executable file not found in $PATH".

이것은 드문 구성이 아닙니다. 많은 최소 이미지에는 대상 서비스를 지원하는 데 필요한 바이너리 만 포함되어 있습니다. 다행히도 이미지의 내용 에 의존하지 않는 이미지 파일 시스템을 탐색하는 메커니즘이 있습니다 . 컨테이너 파일 시스템을 tar 아카이브로 docker export내보내는 명령 이 가장 쉬운 방법 일 것입니다 . 따라서 컨테이너를 시작하십시오 (실패 여부는 중요하지 않음).

$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured        

그런 다음 docker export파일 시스템을 다음 으로 내보내십시오 tar.

$ docker export $(docker ps -lq) | tar tf -

docker ps -lq"나에게 가장 최근의 고정 표시기 컨테이너의 ID를 부여"가 의미합니다. 이를 명시적인 컨테이너 이름 또는 ID로 바꿀 수 있습니다.


5
이 답변이 주어진 시간에 컨테이너 내부가 무엇인지 그림을 매우 도움이된다
주앙 엔드 레데

2
이 답변은 외국 건축과 이미지의 내용을 탐색하고 그것을 "실행"할 수 없기 때문에 더 정확하고 저에게 효과적입니다
Vladimir Perevalov

95

이미지 내용을보기 위해 컨테이너를 시작해서는 안됩니다. 예를 들어 악의적 인 콘텐츠를 찾고 실행하지 않는 것이 좋습니다. "run"대신 "create"를 사용하십시오.

docker create --name="tmp_$$" image:tag
docker export tmp_$$ | tar t
docker rm tmp_$$

11
위의 두 번째 줄은 파일 시스템 내용 만 나열합니다. 모든 파일을 tar로 가져 오려면 다음과 같이 바꿀 수 있습니다 docker export tmp_$$ > image-fs.tar.
Pino

Windows OS의 두 번째 줄은 무엇입니까? 은 docker export tmp_$$ | tar t작동하지 않습니다.
Alexei Marinichenko

@Alexei Marinichenko tar가 컴퓨터에 설치되지 않았을 수 있습니다. 시도 tar --help를 확인하기 위해.
Abdurrahman I.

1
컨테이너에 쉘이없는 경우에도 작동합니다.
Peter Dotchev

3
@AlexeiMarinichenko -o매개 변수를 사용하여 쓸 파일을 지정할 수 있습니다 . 예 docker export -o c:\temp\tmp_$$.tar tmp_$$.
GiddyUpHorsey

62
docker save nginx > nginx.tar
tar -xvf nginx.tar

다음과 같은 파일이 있습니다.

  • manifest.json – 컨테이너 속성이있는 파일 시스템 레이어 및 json 파일의 이름을 설명합니다.
  • .json – 컨테이너 속성
  • – 각“layerid”디렉토리에는 해당 레이어와 연관된 레이어 속성 및 파일 시스템을 설명하는 json 파일이 있습니다. Docker는 이미지 전체에서 레이어를 재사용하여 컨테이너 이미지를 레이어로 저장하여 저장 공간을 최적화합니다.

https://sreeninet.wordpress.com/2016/06/11/looking-inside-container-images/

또는

다이빙 을 사용 하여 TUI로 대화식으로 이미지 컨텐츠를 볼 수 있습니다

여기에 이미지 설명을 입력하십시오

https://github.com/wagoodman/dive


5
파일을 얻기 위해 컨테이너를 시작할 필요가 없기 때문에 이것은 나에게 가장 유용한 답변 인 것 같습니다.
Alec Thomas

1
@AlecThomas에 절대적으로 동의하고 한 걸음 더 나아 가기 위해 docker본질적으로 다른 유형의 아카이브 파일의 내용을보아야하는 이유는 무엇입니까?
Ed Randall

좋은 대답은 태그를 지정하는 것입니다. docker save --output nginx.tar nginx:latest그렇지 않으면 문서에 따르면 "모든 상위 레이어 및 모든 태그 + 버전"을 포함합니다.
Tarek

내부에 유닉스 유틸리티가없는 경우 내부를 탐색 할 수있는 유일한 방법 일 수 있으므로이 방법을 상향 조정해야합니다. 또한이 방법은 컨테이너를 만들 필요가 없습니다.
Stanislav German-Evtushenko

9

이미지의 자세한 내용을 나열하려면 컨테이너에서 종료하자마자 제거 해야하는 docker run --rm image/name ls -alR곳 에서 실행해야합니다 --rm.

여기에 이미지 설명을 입력하십시오


11
이것은 이미지가 ls가능하고PATH
chaosaffe

6

도커 이미지 살펴보기 !

  1. 어떤 종류의 껍질이 있는지 알아 bash내거나sh 또는 ...

    먼저 이미지를 검사하십시오. docker inspect name-of-container-or-image

    json return 을 entrypoint찾거나 찾으십시오 cmd.

  2. 그런 다음 수행하십시오. docker run --rm -it --entrypoint=/bin/bash name-of-image

    일단 내부 : ls -lsa또는 다음과 같은 다른 쉘 명령 :cd ..

    -it대화 형 및 tty 의 약자. 가 --rm실행 한 후 제거 컨테이너를 의미합니다.


1
이 답변의 문제는 허용 대답에서 논의 된 바와 같이, 이미지가 가지고있는 보장이 없다,이다 어떤 거기에 쉘을. 또는 ls. 또는 실제로 일반적인 도구입니다.
larsks

3

다음과 같이 간단한 것을 시도해 볼 수 있습니다.

docker image inspect image_id

이것은 Docker 버전에서 작동했습니다.

DockerVersion": "18.05.0-ce"

13
이것은 내용을 보여주지 않는다 ; 이미지를 만드는 데 사용 된 레이어 등 만 표시합니다.
Roger Lipscombe

0

Windows 용 Docker EE (Hyper-V Server 2016의 17.06.2-ee-6)를 사용하면 Windows 컨테이너의 모든 내용을 검사 할 수 있습니다. C:\ProgramData\docker\windowsfilter\ 를 사용하면 호스트 경로 .

특별한 장착이 필요하지 않습니다.

폴더 접두사는 docker ps -a출력 에서 컨테이너 ID로 찾을 수 있습니다 .


-1

컨테이너 이미지를 스캔하는 데 사용할 수있는 Anchore라는 무료 오픈 소스 도구가 있습니다. 이 명령을 사용하면 컨테이너 이미지의 모든 파일을 나열 할 수 있습니다

anchore-cli 이미지 컨텐츠 myrepo / app : 최신 파일

https://anchore.com/opensource/

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