다음과 같은 작업 디렉터리가 있다고 가정해 보겠습니다.
$ 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"
]
위의 내용은 jq
JSON 데이터를 쿼리하기 위한 도구일 뿐입니다. 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
스토리지 드라이버(현재 전부는 아니지만 대부분의 플랫폼에서 기본 드라이버)를 사용하고 있다고 가정합니다. 다른 드라이버를 사용하면 디스크의 레이아웃이 달라집니다.