Dockerfile에 COPY 꼭 써야 할까? 내 얘기 좀 들어봐요 😅
Docker로 개발 좀 해보셨다면 이런 생각 한 번쯤 해보셨을 거예요.
"에이, 어차피 bind mount로 로컬 코드 다 연결되는데 Dockerfile에서 또 COPY 하라는 건 왜지?"
저도 처음에 그랬어요. 그거 완전 중복 아냐? 라고 생각했죠. 근데 이게요, 막상 실전 배포를 생각하면 이야기가 좀 달라지더라고요.

우선 볼륨이랑 바인드 마운트, 이거부터 찬찬히!
- volume은 Docker가 직접 관리하는 저장공간으로, container가 꺼져도 데이터가 남아있음
- bind mount는 로컬 폴더를 container에 바로 연결해서 실시간 코드 반영 가능
- 개발 시에는 편리하지만, 배포 환경에서는 주의가 필요함
COPY 얘기하기 전에, 개념 정리부터 살짝 하고 갈게요.
volume은 Docker가 알아서 관리해주는 저장소 같은 거예요. container 꺼졌다 켜져도 데이터가 살아있어요. 신기하죠?
반면에 bind mount는 그냥 우리 컴퓨터 폴더를 container 안에 그대로 갖다 쓰는 거예요. 그래서 코드 바꾸면 바로 적용되고요. 저는 이게 진짜 혁명이라고 느꼈어요. 개발할 땐 특히나요.
근데 이렇게 편하다고 무조건 좋은 건 아니에요. 특히 "개발"과 "배포" 사이의 차이를 놓치면 큰일 나요.
개발할 때 자주 쓰는 run 명령어 있잖아요
docker run -v $(pwd):/app your-image-name
이거 진짜 많이 쓰죠? 저도 늘 이렇게 썼어요. 지금 폴더가 container에 /app으로 들어가니까, 수정만 하면 바로 반영되고요. 너무 편하죠.
그러니까 자연스럽게 이런 생각이 들어요:
"그럼 굳이 COPY를 왜 하지? mount가 알아서 덮어쓰는데…"
사실, 저도 그래서 한동안 COPY 뺐다가… 진짜 피봤어요. 😭

COPY 빼고 한번 해봤다가 생긴 일
- COPY를 Dockerfile에서 제거해도 개발 환경에서는 앱이 잘 작동함
- 바인드 마운트 덕분에 로컬 코드가 container에 적용되어 문제 없어 보임
- 처음엔 COPY가 필요 없다고 느껴질 수 있음
한 번은 궁금해서 진짜 COPY 지워봤어요:
# COPY . .
그리고 평소처럼 이미지 빌드하고:
docker build -t feedback-node-nocopy .
container도 잘 돌아가고, 앱도 문제없어 보이더라고요:
docker run -v $(pwd):/app feedback-node-nocopy
"헐~ 진짜 COPY 필요 없네?" 라고 생각한 찰나...
진짜 문제는 "배포"할 때 생겨요
- 운영 서버에는 로컬 코드를 바인드할 경로가 없음
- 바인드 마운트가 없으면 container는 코드 없이 실행됨
- COPY 없이 빌드된 이미지로는 앱이 정상 작동하지 않음
- COPY는 배포를 위한 필수 안전장치 역할을 함
개발 환경에선 괜찮았죠. 근데 배포하려고 서버에 띄우니까, 갑자기 어플이 안 뜨는 거예요. 이게 무슨 일이냐고요?
운영 서버에는 여러분의 코드가 바인드될 디렉터리 같은 게 없어요. 거긴 오직 container 이미지만 있죠. 바인드 마운트 없이요.
이럴 때 COPY 안 해두면, container 안에 소스코드 자체가 없는 거예요. 😱 그래서 COPY가 진짜 중요해요.
한마디로 정리하면: COPY는 배포를 위한 안전장치예요.
개발은 편하게, 배포는 확실하게 – 둘 다 잡는 법
- 개발 중에는 bind mount를 사용해 실시간 코드 반영 가능
- 배포용 이미지를 만들 땐 Dockerfile에 COPY로 코드 포함
- 두 방식을 병행하면 빠른 개발과 안정적인 배포 둘 다 확보 가능
그럼 어떻게 해야 할까요?
- 개발 중엔 bind mount로 실시간 반영을 누리고,
- Dockerfile에선 COPY로 코드까지 이미지에 포함시켜두기
이러면 개발할 땐 빠르게 작업하고, 배포할 땐 튼튼한 이미지로 밀어 넣을 수 있어요. 정말 둘 다 잡는 구성이에요. 전 요즘 이렇게 해요. 😎
그놈의 node_modules는 진짜 조심해야 해요
- 로컬에 존재하는 node_modules가 COPY될 경우 문제가 발생할 수 있음
- 오래된 모듈, OS 차이, 충돌 가능성 등으로 container에서 문제 유발
- 예상치 못한 오류로 인해 시간 낭비 가능성 큼
솔직히 말해보면, 전 이걸로 몇 번 멘붕 왔어요.
COPY . . 하면 디렉터리 전체가 들어가는데, 내 컴퓨터에 있던 node_modules도 같이 복사돼버리는 거예요.
근데 그게 문제인 이유는요:
- 이미 설치된 모듈들이 너무 옛날일 수도 있고,
- os 차이 때문에 실제 container 안에선 안 돌아갈 수도 있고,
- 심지어 npm install 한 거랑 충돌날 수도 있어요.
저는 이거 모르고 삽질하다가 하루 날린 적 있어요. 진짜 피곤했죠.

그래서 꼭 써야 하는 .dockerignore 파일
- Docker에서 COPY할 때 제외할 파일을 지정하는 설정 파일
- node_modules 같은 불필요한 폴더를 이미지에 포함되지 않게 차단
- 최종 이미지의 용량을 줄이고, 설치 충돌을 방지함
그 이후로 저는 .dockerignore 꼭 챙깁니다.
이게 뭐냐면, .gitignore처럼 Docker에게 "이건 건드리지 마~"라고 말해주는 거예요.
예시로 이런 거요:
node_modules
dist
coverage
npm-debug.log
이렇게 하면 Docker가 COPY할 때 이런 폴더는 그냥 무시해요. 깔끔하죠? 그래서 이미지엔 깔끔하게 필요한 파일만 들어가요. 전 이거 쓰고 나서 진짜 스트레스 줄었어요.
마무리: COPY는 선택이 아니라 필수!
자, 한 번 정리해볼까요?
- 개발할 땐 bind mount로 빠르게!
- 배포할 땐 COPY로 코드 포함된 안정적인 이미지!
- 그리고 .dockerignore로 불필요한 파일은 과감히 컷!
이 조합이면 정말로 속도도 챙기고, 안정성도 챙겨요. 실전에서는 이런 게 진짜 중요하더라고요.
'SW > Kubernetes, Docker' 카테고리의 다른 글
| Docker Networking 개념 쉽게 배우기: 실습 기반 설명과 팁 (0) | 2025.09.09 |
|---|---|
| Docker ARG와 ENV 차이점 완벽 정리: 실무에서 바로 써먹는 설정 팁 (0) | 2025.09.08 |
| Docker에서 read-only mount 설정하는 이유와 실전 적용 팁 (0) | 2025.09.06 |
| Nodemon으로 Docker 개발환경 자동화하는 법 (Node.js 개발자 필독!) (0) | 2025.09.05 |
| Docker bind mount 설정 시 꼭 알아야 할 node_modules 보호법 (0) | 2025.09.04 |