https://pabeba.tistory.com/285
지난번 Dockerfile 기본 베이스 이미지 설정(FROM)에 이어,
이번에는 우리가 만든 소스 코드나 설정 파일들을 도커 이미지 내부로 집어넣는 방법에 대해 알아보겠습니다.
도커 이미지를 커스텀하는 가장 주된 이유 중 하나가 바로 우리가 개발한 애플리케이션 코드를 이미지 안에 포함시키기 위함이죠.
이때 사용하는 핵심 명령어가 바로 ADD와 COPY입니다.
파일 구성
step2 디렉토리 아래 해당 파일 생성
web.tar 안에는 1.txt, 2.txt가 들어있습니다.

1. 주요 명령어 지식 더하기: ADD vs COPY & WORKDIR
파일을 복사한다는 목적은 같지만, ADD와 COPY는 약간의 기능적 차이가 있습니다. 공식 문서에서는 명확한 목적에 따라 두 명령어를 구분해서 사용할 것을 권장합니다.
- COPY (추천):
- 호스트 PC에 있는 파일이나 디렉토리를 이미지 내부로 순수하게 '복사'만 합니다.
- 복사 시 파일명을 변경할 수도 있습니다.
💡 Tip: 로컬에 있는 소스 코드를 옮길 때는 동작이 직관적이고 투명한 COPY를 사용하는 것이 도커의 베스트 프랙티스(Best Practice)입니다.
- ADD:
- COPY의 기능을 모두 포함하면서, 강력한 부가 기능 2가지를 더 가지고 있습니다.
- URL 다운로드: 원격 URL을 지정하면, 해당 링크에서 파일을 다운로드하여 이미지에 추가합니다.
- 압축 자동 해제: 로컬에 있는 .tar 등 압축 파일을 추가할 때, 이미지 내부로 들어가면서 자동으로 압축을 풀어서 저장해 줍니다.
- WORKDIR:
- 리눅스의 cd 명령어와 같습니다. 이후 작성되는 모든 COPY, ADD, RUN, CMD 등의 명령어가 실행될 '작업 디렉토리(Working Directory)'를 지정합니다.
- 만약 지정한 디렉토리가 이미지 내부에 없다면, 도커가 알아서 해당 디렉토리를 생성해 줍니다.
2. .dockerignore 파일 활용하기
이미지를 빌드할 때, 프로젝트 폴더 안에는 도커 이미지에 포함될 필요가 없는 파일들(예: 로컬 테스트용 로그 파일, 빌드 캐시, node_modules 등)이 섞여 있을 수 있습니다.
이때 .dockerignore 파일을 작성하면, 명시된 파일이나 패턴을 이미지 빌드 컨텍스트(Build Context)에서 완전히 제외해 줍니다. 이는 불필요한 용량 차지를 막아 이미지 빌드 속도를 높이고 보안을 강화하는 아주 중요한 역할을 합니다. Git을 쓰실 때 사용하는 .gitignore와 완벽히 같은 역할이라고 보시면 됩니다.
3. 실습: Dockerfile 작성 및 빌드
준비된 step2 디렉토리 내부에 여러 테스트 파일(po1.txt, po2.txt, web.tar 등)이 있다고 가정하고, 이를 조합하여 Dockerfile을 작성해 보겠습니다.
1) 설정 파일 준비
.dockerignore 작성 우선, po2.txt 파일은 이미지에 포함되지 않도록 제외하겠습니다.
po2.txt
Dockerfile 작성
# 1. 베이스 이미지 설정
FROM ubuntu
# 2. ADD 활용 (압축 해제 및 URL 다운로드)
# 압축 파일 ADD: 이미지 내부로 들어가면서 자동으로 압축이 풀립니다.
ADD web.tar /home/
# URL 다운로드 ADD: 지정한 원격지에서 파일을 받아 /home 에 저장합니다.
ADD https://raw.githubusercontent.com/ultralytics/yolov5/master/requirements.txt /home/requirements.txt
# 파일 복사 및 파일명 변경
ADD readme.MD /home/readme2.md
# 와일드카드(*)를 이용한 패턴 추가 (po1.txt, po3.txt 추가됨. po2.txt는 .dockerignore에 의해 무시됨)
ADD po*.txt /home/
# 정규식(?)을 이용한 패턴 추가: ?는 단일 문자를 의미 (t1.txt 등 추가)
ADD t?.txt /home/
# 3. WORKDIR 및 COPY 활용 (가장 많이 쓰이는 소스 코드 카피 패턴)
# 작업 디렉토리를 /usr/app 으로 이동 (없으면 생성됨)
WORKDIR /usr/app
# COPY <로컬경로> <컨테이너경로>
# "." 은 현재 디렉토리를 의미합니다. 즉, 로컬의 현재 모든 파일을 컨테이너의 /usr/app 에 전부 복사합니다.
COPY . .
2) 커스텀 이미지 빌드
이제 작성한 Dockerfile을 바탕으로 test_ubuntu:1.2 라는 태그명을 달아 이미지를 구워보겠습니다.
# 현재 디렉토리(.)를 기준으로 빌드 진행
docker build -t test_ubuntu:1.2 ./step2
3) 컨테이너 가동 및 결과 검증
잘 구워진 이미지가 의도한 대로 파일들을 잘 품고 있는지 확인해 볼 차례입니다.
컨테이너를 가동하고 내부에 직접 접속해 보겠습니다.
# 1. 컨테이너 생성 및 백그라운드 가동 (-itd)
docker run -itd --name test_ubuntu_df_1.2 test_ubuntu:1.2
# 결과: 1500f3b9a012baacc5a0375f95690c7aab91651a7c8af21605f583c8c7eabd27
# 2. 활성화된 컨테이너 정상 동작 확인
docker container ps
# 출력결과: test_ubuntu_df_1.2 컨테이너가 Up 상태임을 확인
# 3. 컨테이너 내부에 bash 셸로 접속
docker exec -it test_ubuntu_df_1.2 bash
[접속 후 생성된 파일 확인]
먼저 /home 디렉토리를 확인해 봅니다.
root@7eca2648bcc1:/usr/app# ls /home
1.txt 2.txt po1.txt po3.txt readme2.md requirements.txt t1.txt ubuntu
- web.tar 파일이 자동으로 풀려서 1.txt, 2.txt 등으로 들어왔습니다.
- .dockerignore 덕분에 po2.txt는 제외되고 po1.txt, po3.txt만 복사되었습니다.
- readme.MD가 readme2.md로 이름이 잘 변경되었습니다.
- URL로 지정했던 requirements.txt도 성공적으로 다운로드되었습니다.
이번엔 WORKDIR로 지정한 /usr/app 내부를 확인해 보겠습니다.
root@7eca2648bcc1:/usr/app# ls /usr/app
Dockerfile po1.txt po3.txt readme.MD 't1 copy.txt' t1.txt web.tar
- COPY . . 명령어에 의해 로컬 폴더에 있던 소스 파일 전체가 우리가 설정한 작업 디렉토리(/usr/app) 내부로 고스란히 복사된 것을 볼 수 있습니다. (마찬가지로 po2.txt는 제외됨)
이처럼 ADD와 COPY, 그리고 WORKDIR를 적절히 활용하면, 복잡한 애플리케이션 파일 구조도 도커 이미지 내부에 깔끔하게 이식할 수 있습니다!
'코딩 개발 > Docker' 카테고리의 다른 글
| Dockerfile 기본 활용법 - FROM (0) | 2026.08.06 |
|---|---|
| Docker - Volume & Mount (볼륨, 마운) (0) | 2026.08.05 |
| Docker - Network 네트워크 (0) | 2026.08.04 |
| Docker - Container 컨테이너 (0) | 2026.08.03 |
| Docker - Image 이미지 (0) | 2026.07.31 |