728x90
도커파일의 명령어 중 COPY와 ADD는 캐시를 이용할 때 String과 함께 파일의 내용 변화도 확인한 후 캐시 사용 여부를 결정한다고 저번 포스팅에서 알아봤습니다.
그리고 도커는 빌드시 레이어를 만들어 캐시를 저장한 뒤 활용할 수 있다 했습니다.
같은 도커파일 내에서 어떤 상황일때 캐시 레이어를 활용할 수 있는지 확인해 보겠습니다.
예시:
디렉토리 명은 nodejs-docker-app이고 내부엔 다음과 같은 파일이 있다고 가정하겠습니다.
Dockerfile package.json server.js
변경 전
# Dockerfile
FROM node:10
WORKDIR /usr/src/app
COPY . .
RUN npm install
CMD [ "node", "server.js" ]
변경 후
# Dockerfile
FROM node:10
WORKDIR /usr/src/app
COPY package.json .
RUN npm install
COPY . .
CMD [ "node", "server.js" ]
변경 후의 차이는 RUN 명령어를 사이로 COPY 명령어를 2개 만들어 주었습니다.
이렇게 만들면 도커 파일의 레이어 캐시를 이용해 좀 더 빠른 빌드가 가능합니다.
도커 파일 연속하는 COPY명령어는 동일한 경로로 복사하는 명령어들은 같은 레이어로 분류합니다.
COPY file1.txt /app
COPY file2.txt /app
그래서 같은 경로로 복사하기 때문에 변경 후의 도커파일은 캐시를 이용해 더욱 빠르게 빌드가 가능합니다.
연속하는 COPY 명령어의 경우 같은 레이어로 분류되어 캐싱이 가능하다고 했는데 "변경 후" 예시는 가운데 명령어가 포함되어 있습니다.
가운데 RUN
명령어가 포함되었지만 다음과 같은 경우라면 문제 없습니다.
1. 캐시 공유가 가능한 경우
# RUN 명령어가 캐시에 영향을 미치지 않는 경우
COPY package.json .
RUN echo "Hello, world!"
COPY . .
# 명령어가 --no-cache 옵션을 사용하지 않는 경우
COPY package.json .
RUN npm install
COPY . .
명령어가 캐싱을 지원하는 경우엔 가능
1. 패키지 관리 명령어:
apt-get
yum
npm
pip
maven
2. 빌드 도구:
make
cmake
gradle
3. 기타 명령어:
echo
cat
grep
sed
2. 캐시 공유가 불가능한 경우
# RUN 명령어가 파일 시스템에 영향을 미치는 경우
COPY package.json .
RUN mkdir bin
COPY . .
# RUN 명령어가 --no-cache 옵션을 사용하는 경우
COPY package.json .
RUN npm install --no-cache
COPY . .
파일 시스템에 영향을 주는 명령어
mkdir, touch, rm, cp, mv
RUN echo "Hello, world!" > hello.txt
이 명령어는 실행 시점에 이미지 레이어에 포함된 파일을 생성하기 때문에 캐시 사용X
# 참고: 따라하며 배우는 도커와 CI 환경, 저자: 안재원, 출판사: 위키북스
728x90
'[Cloud] > [Docker]' 카테고리의 다른 글
[Docker] Docker cache 빠른 빌드 (0) | 2024.03.08 |
---|---|
[Docker] 도커파일 기본설정 ubuntu, alpine, python:3.9-slim (0) | 2024.03.05 |
[Docker] 도커 기본 명령어 (2) | 2023.12.11 |
[Docker] 도커의 이미지, 컨테이너는 무엇일까? (2) | 2023.11.26 |