자율 학습/스터디
[Docker] Dockerfile COPY 개선
60cod
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 설정했기 때문에 접속하면 시작부터 그 폴더 경로에 있다.
