자율 학습/스터디

[Docker] Dockerfile COPY 개선

2024. 6. 23. 19:18

1. COPY 내용이 변경됐을 때 RUN 실행

캐시 때문에 변경된 게 있을 때에만 설치, 빌드 시킬 수 있다.

 

1) package.json 변경된 게 있으면 npm install

2) 나머지 소스코드 변경된 게 있으면 npm run build

 

 

변경 전

FROM node:18

COPY . .

RUN npm install
RUN npm run build

CMD ["npm", "start"]

 

 

변경 후

FROM node:18

COPY package*.json .

RUN npm install

COPY . .

RUN npm run build

CMD ["npm", "start"]

 

 

 

2. 도커 이미지 크기 축소

Dockerfile을 두 단계로 분리

1) build 단계

2) production 단계

 

 

변경 후

# Build stage

FROM node:18 as BUILD

COPY package*.json .

RUN npm install

COPY . .

RUN npm run build

# Production stage

FROM node:18 as PRODUCTION

COPY --from=BUILD ./build ./build
COPY --from=BUILD ./package.json ./package.json
COPY --from=BUILD ./package-lock.json ./package-lock.json

RUN npm install --only=production

CMD ["npm", "start"]

 

 

 

✔️ PRODUCTION 단계 설명

  • COPY --from=BUILD ./build ./build
    ➡️ BUILD 단계 컨테이너 안에 있는 build 폴더 복사해와서 PRODUCTION 컨테이너 안에 build 폴더로 넣는다.
  • npm install --only=production(또는 --only=prod)
    ➡️ dependencies에 정의된 패키지만 설치한다.

 

 

 

 

3. WORKDIR 설정

컨테이너 접속해보면 내부 폴더 구조가 엉망..

 

그냥 복사하지 않고 경로를 설정하자.

보통은 /usr/src/ 하위에 애플리케이션 이름으로 폴더 생성해서 넣는다.

 

주의할 것은,

PRODUCTION 단계에서 BUILD 단계로부터 복사해올 때도 WORKDIR 경로 붙여줘야 한다는 것!

 

 

변경 후

# Build stage

FROM node:18 as BUILD

WORKDIR /usr/src/app-dir

COPY package*.json .

RUN npm install

COPY . .

RUN npm run build

# Production stage

FROM node:18 as PRODUCTION

WORKDIR /usr/src/app-dir

COPY --from=BUILD ./usr/src/app-dir/build ./build
COPY --from=BUILD ./usr/src/app-dir/package.json ./package.json
COPY --from=BUILD ./usr/src/app-dir/package-lock.json ./package-lock.json

RUN npm install --only=production

CMD ["npm", "start"]

 

 

 

➡️ 확인 단계

도커 이미지 생성

docker build -t {이미지이름} .

 

실행

docker run -it --env-file .env {이미지이름}

 

접속

docker exec -it {컨테이너ID}

 

WORKDIR 설정했기 때문에 접속하면 시작부터 그 폴더 경로에 있다.