기본 패턴
dockerfile
FROM node:22-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build설명
docker build .의 마지막.은 현재 디렉터리를 build context로 보낸다는 뜻입니다.- builder는 이 context 안의 파일만 볼 수 있으므로, 불필요한 파일을 줄이는
.dockerignore가 중요합니다. - Docker는 각 지시어를 레이어처럼 취급해, 이전 단계 결과를 캐시로 재사용할 수 있으면 다시 만들지 않습니다.
- 그래서 의존성 파일(
package.json,requirements.txt)을 먼저 복사하고 설치한 뒤, 자주 바뀌는 앱 소스를 나중에 복사하는 패턴이 흔합니다. - 캐시를 이해하지 못하면 빌드가 매번 느려지고, 이미지에 테스트 산출물이나 로컬 캐시 같은 불필요한 파일까지 들어가기 쉽습니다.
짧은 예제
text
좋은 순서:
1. package.json 복사
2. npm ci
3. 소스 코드 복사
나쁜 순서:
1. 소스 전체 복사
2. npm ci
소스 한 줄만 바뀌어도 의존성 설치 캐시가 깨질 수 있음빠른 정리
| 개념 | 의미 |
|---|---|
| build context | 빌드에 전달되는 파일 범위 |
.dockerignore | context에서 제외할 파일 목록 |
| 레이어 캐시 | 바뀌지 않은 빌드 단계를 재사용 |
| 복사 순서 | 캐시 효율에 직접 영향 |
| 흔한 최적화 | 의존성 파일 먼저, 소스는 나중에 복사 |
주의할 점
.git, node_modules, 빌드 산출물, 테스트 결과를 그대로 context에 보내면 빌드가 느려지고
이미지도 불필요하게 커집니다. Dockerfile과 .dockerignore는 항상 함께 설계하는 편이 좋습니다.
참고 링크
2 sources