파일 작성 시 변경 사항이 적은 instruction은 위로, 변경 사항이 많은 instruction은 아래에 작성
이유
----
image
FROM A A
RUN 2 2
ENV 3 3
ADD 수정 4 a -> 이 처럼 만약에 add에서 달라지면 cmd, entrypoint 부분도
CMD 5 b 같은 값이여도 layer가 변경됌
ENTRYPOINT 6 c
Docker 파일 캐쉬 문제
1년전 다운 받은 A 처음 B
FROM ubuntu:22.05 A A
RUN apt-get update B C
=> 이미 1년전 이미지를 받아놔서 캐쉬가 있어 1년전에는 같은 layer의 image를
다운받는데 처음받는 B는 apt-get은 계속 업데이트가 되니 업데이트 된 C의 layer를 가진
image를 다운 받아 버전에 오류가 발생할 수 있음
즉, 같은 명령어라도 시점에 따라서 버전이 달라질 수 있음을 인지해야함
해결 방법으로는 "docker build --no-cache" 로 build시는 해결 가능
.
.
.
Dockerfile 수정 layer 변경
Layer 변경 O, X 표시
FROM A
RUN apt-get upgrade
RUN apt-get install git
----------------------------
FROM A O
ARG ITEMS = git X
RUN apt-get upgrade O - 미변경
RUN apt-get install $(ITEMS) O
----------------------------
FROM A O
ARG ITEMS = curl X
RUN apt-get upgrade O
RUN apt-get install $(ITEMS) X - 변경
=> ARG는 Layer에 쌓이지 않으니 ARG가 수정되어 X가 되어도 위와 같이 아래 layer들이
새로운 것으로 변경되지 않음, 그래서 RUN apt-get upgrade는 그대로, 아래 변수명을
사용한 RUN 부분만 수정이 되어 layer가 변경됌
ARG OS
FROM golang:1.19-${OS}
https://docs.docker.com/engine/reference/commandline/tag/
command
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
예시
ubuntu:22.04 존재 가정
----------------------
docker tag ubuntu:22.04 my-ubuntu:v1
결과
----
$ docker images
REPOSITORY TAG IMAGE ID SIZE
ubuntu 22.04 a1b2c3d4e5f6 77MB
my-ubuntu v1 a1b2c3d4e5f6 77MB
=>
디스크 공간을 추가로 사용하지 않고, 해당 이미지를 참조하는 이름 하나 생긴 것
그래서 IMAGE ID는 동일함
command
docker push [OPTIONS] NAME[:TAG]
옵션
----
--all-tags = -a : 모든 태그를 가진 이미지를 푸쉬
주의 사항