핵심 정리
# .dockerignore
node_modules
.git
dist
.env
*.log
coverage
.DS_Store패턴 기준
어떤 build context 위생 기준을 먼저 떠올리면 되나
| 상황 | 먼저 떠올릴 선택 |
|---|---|
| 빌드 시작이 느리다 | .dockerignore부터 확인 |
| 민감 파일이 이미지에 섞일까 걱정된다 | .env, 키 파일 제외 |
| 캐시가 자주 깨진다 | 자주 바뀌는 파일이 context에 들어가는지 확인 |
.gitignore만 믿고 있다 | .dockerignore 별도 관리 |
빌드 컨텍스트 전송 원리 — docker build 실행 시 현재 디렉터리 전체가 데몬으로 전송된다
docker build .를 실행하면 Docker CLI는 . 디렉터리의 파일 전체를 Docker 데몬(또는 BuildKit)에 압축해서 전송합니다. COPY 지시어가 실제로 쓰는 파일이 몇 개 뿐이어도, 컨텍스트로 지정된 디렉터리의 모든 파일이 먼저 전송됩니다. node_modules나 .git처럼 수백 MB에 달하는 폴더가 포함되면 빌드가 시작되기도 전에 느려집니다.
# 빌드 컨텍스트 크기 확인
docker build --no-cache --progress=plain . 2>&1 | grep "transferring context"
# 원격 데몬을 쓴다면 네트워크 대역폭도 소모됨
DOCKER_HOST=tcp://remote:2376 docker build ..dockerignore 문법 — .gitignore와 비슷하지만 Docker build 입력을 줄이는 목적이다
.dockerignore 파일은 빌드 컨텍스트에서 제외할 경로 패턴을 지정합니다. 와일드카드(*, **)와 부정 패턴(!)을 지원합니다. .gitignore와 문법이 비슷해 보이지만 별개의 파일이며, .gitignore에 적어도 Docker는 자동으로 제외하지 않습니다. Docker build 성능 최적화의 첫 단계입니다.
# 의존성 (재설치하므로 불필요)
node_modules
vendor
# 버전 관리 메타데이터
.git
.gitignore
# 빌드 산출물
dist
build
.next
# 민감 파일 (절대 이미지에 포함되면 안 됨)
.env
*.pem
*.key
secrets/
# 부정 패턴 — 특정 파일만 포함
!dist/server.jsnode_modules와 .git을 제외해야 하는 이유 — 빌드 시간, 보안, 캐시 효율 모두 영향을 받는다
node_modules를 컨텍스트에 포함하면 수백 MB를 전송하고, Dockerfile에서 RUN npm ci가 어차피 새로 설치하므로 전송한 파일은 쓰이지 않습니다. .git은 커밋 히스토리 전체를 포함하므로 크고, 실수로 이미지에 복사되면 소스 이력이 노출됩니다. .env 파일이 포함되면 환경 변수 값이 이미지 레이어에 남아 보안 위험이 생깁니다.
# .dockerignore 없이 빌드할 때
# Sending build context to Docker daemon 450MB
# .dockerignore 추가 후
# Sending build context to Docker daemon 2.1MB체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 빌드 시작이 느릴 때 | .dockerignore로 node_modules, .git 제외 |
| 이미지에 민감 파일이 포함될 위험 | .env, *.key, secrets/ 제외 |
| 캐시가 예상보다 자주 깨질 때 | 자주 바뀌는 파일이 컨텍스트에 포함됐는지 확인 |
| .gitignore와 .dockerignore 동기화 | 별개로 관리, 자동 연동 없음 |
| 제외 규칙 적용 결과 확인 | docker build --progress=plain 로그 확인 |
주의할 점
.gitignore에 등록해도 Docker build에서는 자동으로 제외되지 않는다. Docker는 .dockerignore만 별도로 읽으므로, .env나 *.pem 같은 민감 파일은 반드시 .dockerignore에도 명시해야 한다. 이미지에 비밀 파일이 한 번 포함되면 레이어로 남아 docker history나 이미지 추출로 복구될 수 있다.
참고 링크
2 sources