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 설정했기 때문에 접속하면 시작부터 그 폴더 경로에 있다.

'자율 학습 > 스터디' 카테고리의 다른 글
| [LeetCode] 735. Asteroid Collision 문제 풀이 (0) | 2025.03.11 |
|---|---|
| [Docker] Docker container graceful shutdown (SIGTERM) (0) | 2024.06.23 |
| [Docker, Redis] 애플리케이션 도커 이미지 만들기 (host.docker.internal) (0) | 2024.06.23 |
| [Docker] dockerfile 작성해서 도커 image 만들기 (커스텀 이미지) (0) | 2024.06.20 |
| [Docker, Redis] Port mapping 방법 (0) | 2024.06.20 |