![[도커 #6] 도커 COPY 및 도커파일 주요 명령어](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog-custom%3Ftitle%3D%255B%25EB%258F%2584%25EC%25BB%25A4%2B%25236%255D%2B%25EB%258F%2584%25EC%25BB%25A4%2BCOPY%2B%25EB%25B0%258F%2B%25EB%258F%2584%25EC%25BB%25A4%25ED%258C%258C%25EC%259D%25BC%2B%25EC%25A3%25BC%25EC%259A%2594%2B%25EB%25AA%2585%25EB%25A0%25B9%25EC%2596%25B4%26tag%3DTemplate%2B1%26description%3D%26template%3D3%26backgroundImage%3Dhttps%253A%252F%252Fsource.inblog.dev%252Fog_image%252Fdefault.png%26bgStartColor%3D%2523a8e8ec%26bgEndColor%3D%2523a8e8ec%26textColor%3D%2523000000%26tagColor%3D%2523000000%26descriptionColor%3D%2523000000%26logoUrl%3D%26blogTitle%3DGyeongwon%2527s%2Bblog&w=3840&q=75)
COPY 는 주로 Dockerfile에서 사용되는 명령어고, 이미지 안에 정적인 파일을 포함시킬 때 사용한다.1. COPY란 ?
Dockerfile에서 호스트의 파일/디렉토리를 컨테이너 이미지 안에 복사하는 명령어
COPY [소스 경로] [컨테이너 내 대상 경로]예시
COPY ./htdocs /usr/local/apache2/htdocs/→
.htdocs파일을 컨테이너 이미지 안의 /usr/share/nginx/html/ 등으로 복사한다는 뜻이다. Dockerfile에서의 예시
FROM nginx
COPY ./html /usr/share/nginx/html
COPY ./conf.d /etc/nginx/conf.d
CMD ["nginx", "-g", "daemon off;"]nginx 기반 이미지에:
html폴더를 웹 루트에 넣고
conf.d에 설정 파일 덮어씌운 다음
- nginx를 포그라운드로 실행하는 이미지 빌드
COPY ./html ... → 정적 웹 콘텐츠를 이미지에 정적으로 포함COPY ./conf.d ... → Nginx 설정을 이미지 빌드 실점에 고정즉, 빌드 후에는 변경 불가. 변경하려면 다시
docker build 해야 함2. Docker 이미지 빌드 명령어
docker build [옵션] -t 이미지이름[:태그] 경로
예시
docker build -t my-nginx:1.0 .
현재 디렉토리의 Dockerfile을 기반으로my-nginx:1.0이라는 이름의 이미지를 생성

3. Dockerfile 주요 명령어 10가지
명령어 | 설명 | 실행 시점 | 캐시 영향 |
FROM | 베이스 이미지 지정 | 빌드 시작 | ✅ |
RUN | 쉘 명령 실행 (설치, 빌드 등) | 이미지 생성 시 | ✅ |
CMD | 컨테이너 실행 시 실행할 명령 | 컨테이너 실행 | ❌ |
COPY | 호스트 파일 복사 | 이미지 생성 시 | ✅ |
ADD | COPY와 유사하나 기능 추가됨 | 이미지 생성 시 | ✅ |
ENV | 환경 변수 설정 | 이미지 생성 시 | ✅ |
EXPOSE | 열 포트 명시 (기능적 의미는 없음) | 문서화 | ❌ |
WORKDIR | 작업 디렉토리 설정 | 이미지 생성 시 | ✅ |
ENTRYPOINT | 컨테이너 시작 시 실행될 기본 명령 지정 | 컨테이너 실행 | ❌ |
VOLUME | 데이터 저장소 디렉토리 명시 | 문서화 + 생성됨 | ❌ |
1️⃣ FROM
FROM ubuntu:20.04- 베이스 이미지 지정 (가장 먼저 와야 함)
- 여러 단계 빌드 시
FROM을 여러 번 쓸 수 있음
2️⃣ RUN
RUN apt update && apt install -y curl- 셸 명령어 실행
- 도커 빌드(이미지 굽는 것) 할 때 실행
- 이미지 내부에 변경사항을 적용한 새 레이어 생성
3️⃣ CMD
CMD ["node", "app.js"- 컨테이너 실행 시(이미지 다 구운 후) 기본 명령어
docker run시 명령어를 지정하면 CMD는 무시됨
- 자주
ENTRYPOINT와 함께 쓰임
4️⃣ COPY
COPY ./src /app/sr- 호스트의 파일/디렉토리를 컨테이너 이미지로 정적으로 복사
- 정적 배포용 빌드에 적합
- copy는 zip 파일 던져주면 압축도 풀어줌
5️⃣ ADD
ADD archive.tar.gz /app/COPY+ 압축 해제, URL 다운로드 기능
- 기능은 많지만 예측 불가 → 실무에서는 대부분
COPY사용
6️⃣ ENV
ENV NODE_ENV=production- 환경 변수 설정
- 환경변수는프로그램 실행 전에 외부에서 주입할 수 있는 설정값이고, 코드 수정 없이 동작을 제어할 수 있는 유연하고 안전한 방법이다.
RUN,CMD,ENTRYPOINT등 다른 명령에서도 사용 가능
7️⃣ EXPOSE
EXPOSE 80- 컨테이너가 사용하는 포트를 명시
- 실제로 포트가 열리는 건 아님 (힌트 느낌)→
p옵션 필요
- 문서화 역할 (팀원/도구를 위한)
8️⃣ WORKDIR
WORKDIR /app- 이후 명령어의 작업 디렉토리 설정
- 디렉토리가 없으면 자동 생성됨
cd명령 쓸 필요 없어짐
- 컨테이너 내부안에 어느 폴더에서 시작하는지..
9️⃣ ENTRYPOINT
ENTRYPOINT ["python", "script.py"]- 컨테이너가 시작될 때 무조건 실행되는 명령어
CMD와는 다르게docker run인자와 합쳐져 실행됨, CMD는 오버라이드 되서 덮어씌워질 수 도 있음
- 고정된 실행 명령을 설정할 때 사용
🔟 VOLUME
VOLUME ["/data"]- 데이터가 저장될 영속적 경로를 명시
- 실제 마운트는
docker run -v로 해야 함
- 도커가 볼륨 자동 생성해줄 수 있음
4. Docker file 실전 예시
정적 웹사이트 배포용 Dockerfile (with Nginx)
# 베이스로 nginx 사용
FROM nginx:stable-alpine
# 정적 HTML 파일 복사
COPY ./html /usr/share/nginx/html
# Nginx 커스텀 설정 덮어쓰기
COPY ./nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
# Nginx 실행 (포그라운드로)
CMD ["nginx", "-g", "daemon off;"]COPY로 HTML과 설정 파일을 이미지에 고정정적 사이트 배포 시 완전 정석
CMD로 nginx 포그라운드 실행 설정html, nginx.conf의 위치가 잘못되면 nginx 404 발생실시간 수정은 안 됨 → 개발엔 bind mount 권장
Spring Boot JAR 실행용 Dockerfile
FROM eclipse-temurin:17-jdk-alpine
WORKDIR /app
COPY ./build/libs/myapp.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]Spring Boot는 보통
.jar 파일 하나로 빌드됨이 Dockerfile은 JAR 파일을 직접 실행하는 방식
ENTRYPOINT를 써서 외부 인자 추가 실행 가능COPY할 JAR 파일 경로 정확히 확인JAR 빌드가 안 돼 있으면 Docker build 시 실패
Share article