Docker 이미지에 추가된 후 제거된 파일을 검색하는 방법은 무엇입니까?

Docker 이미지에 추가된 후 제거된 파일을 검색하는 방법은 무엇입니까?

다음과 같은 작업 디렉터리가 있다고 가정해 보겠습니다.

$ tree .
.
├── Dockerfile
└── file.txt

다음 Dockerfile을 포함합니다:

FROM debian:9

WORKDIR /usr/src/foo

COPY file.txt .

RUN echo Some random command involving file.txt \
  && rm -f file.txt

그런 다음 해당 이미지를 빌드하고 지정된 Docker 레지스트리에 푸시합니다.

$ docker build -t foo/bar .
$ docker login #…
$ docker push foo/bar

file.txt이미지에서 추가된 콘텐츠를 검색한 다음 중간 레이어에서 제거하는 방법이 있나요 ? 대답은 선택에 따라 달라지나요 WORKDIR?

답변1

중간 레이어에 추가되었다가 제거된 file.txt의 내용을 이미지에서 검색할 수 있는 방법이 있나요?

예!

대답은 WORKDIR의 선택에 따라 달라지나요?

아니요. WORKDIR현재 작업 디렉터리를 변경하는 것 외에는 아무 작업도 수행하지 않습니다.


Dockerfile에서 이미지를 빌드할 때 Dockerfile의 각 명령은 새 레이어를 생성합니다. "이미지"는 단순히 컨테이너가 실행될 때 컨테이너의 파일 시스템을 형성하기 위해 결합되는 레이어 모음입니다. 이러한 각 레이어는 On Disk 아래에서 개별적으로 찾을 수 있습니다 /var/lib/docker. 예를 들어 다음 Dockerfile을 사용하여 이미지를 빌드한다고 가정해 보겠습니다.

FROM debian:9
COPY file.txt /root/file.txt
RUN rm -f /root/file.txt

file.txt해당 디렉토리에는 다음 텍스트가 포함된 파일이 있습니다 .

hello world

을 실행하면 docker build -t erikmd .다음이 표시됩니다.

Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM debian:9
 ---> d508d16c64cd
Step 2/3 : COPY file.txt /root/file.txt
 ---> Using cache
 ---> 6f06029c1cca
Step 3/3 : RUN rm -f /root/file.txt
 ---> Using cache
 ---> a2dc62c823c9
Successfully built a2dc62c823c9
Successfully tagged erikmd:latest

빌드 프로세스의 각 단계는 새로운 레이어를 생성합니다.그리고지금까지 모든 Dockerfile 명령의 결과인 중간 이미지를 나타내는 이미지 ID를 제공합니다. about 출력이 주어지면 다음을 실행할 수 있습니다.

$ docker run --rm 6f06029c1cca cat /root/file.txt

그리고 파일의 내용을 봅니다.

hello world

하지만 만약 내가아니요이미지만 만들까요? 이 경우 먼저 docker image inspect다음 명령을 사용하여 이미지를 구성하는 레이어 목록을 확인합니다.

$ docker image inspect erikmd | jq '.[0].RootFS.Layers'
[
  "sha256:13d5529fd232cacdd8cd561148560e0bf5d65dbc1149faf0c68240985607c303",
  "sha256:41494b03ef195ce6db527bd68b89cbebdace66210b4c142e95f8553fcb0bf51e",
  "sha256:1948a4bd00b6f1712667bb2c68d1fe6eb60fbbcdf8bad62653208c23bf2602a5"
]

위의 내용은 jqJSON 데이터를 쿼리하기 위한 도구일 뿐입니다. docker image inspect편리하지 않은 경우 동일한 정보의 출력을 직접 육안으로 검사할 수 있습니다 jq.

스토리지 드라이버의 기본 Docker 구성을 사용한다고 가정하면 다음과 overlay2같습니다 /var/lib/docker/image/overlay2/layerdb/sha256/*/diff.

# grep -l 13d5529fd232cacdd8cd561148560e0bf5d65dbc1149faf0c68240985607c303 \
  /var/lib/docker/image/overlay2/layerdb/sha256/*/diff
/var/lib/docker/image/overlay2/layerdb/sha256/13d5529fd232cacdd8cd561148560e0bf5d65dbc1149faf0c68240985607c303/diff

첫 번째 레이어는 debian:9이미지입니다. 다음을 실행하여 이를 확인할 수 있습니다.

$ docker image inspect debian:9 | jq '.[0].RootFS.Layers'
[
  "sha256:13d5529fd232cacdd8cd561148560e0bf5d65dbc1149faf0c68240985607c303"
]

...그러니 무시하겠습니다. 두 번째 레이어를 찾아보겠습니다.

# grep -l 41494b03ef195ce6db527bd68b89cbebdace66210b4c142e95f8553fcb0bf51e \
  /var/lib/docker/image/overlay2/layerdb/sha256/*/diff
/var/lib/docker/image/overlay2/layerdb/sha256/14347a192896a59fdf5c1a9ffcac2f93025433c66136d3531d7bbb3aec53efc7/diff

이 파일과 동일한 디렉토리에 diff다음이라는 파일이 있습니다 cache-id.

# cat image/overlay2/layerdb/sha256/14347a192896a59fdf5c1a9ffcac2f93025433c66136d3531d7bbb3aec53efc7/cache-id
118b1e4a401873e1db8849c0821d0280b4cf9ef621ccb70cf14fe672dc74ef75

이는 cache-id레이어가 추출된 디렉터리를 식별합니다. 아래에서 찾을 수 있습니다 /var/lib/docker/overlay2/<id>.

# ls /var/lib/docker/overlay2/118b1e4a401873e1db8849c0821d0280b4cf9ef621ccb70cf14fe672dc74ef75
diff/ link lower work/

우리는 이 디렉토리의 내용에 관심이 있습니다 diff/:

# find /var/lib/docker/overlay2/118b1e4a401873e1db8849c0821d0280b4cf9ef6
21ccb70cf14fe672dc74ef75/diff/
/var/lib/docker/overlay2/118b1e4a401873e1db8849c0821d0280b4cf9ef621ccb70cf14fe672dc74ef75/diff/
/var/lib/docker/overlay2/118b1e4a401873e1db8849c0821d0280b4cf9ef621ccb70cf14fe672dc74ef75/diff/root
/var/lib/docker/overlay2/118b1e4a401873e1db8849c0821d0280b4cf9ef621ccb70cf14fe672dc74ef75/diff/root/file.txt

그게 다야!


알아채다위의 모든 내용은 overlay2스토리지 드라이버(현재 전부는 아니지만 대부분의 플랫폼에서 기본 드라이버)를 사용하고 있다고 가정합니다. 다른 드라이버를 사용하면 디스크의 레이아웃이 달라집니다.

관련 정보