Dandy Now!
  • Dockerfile의 COPY 명령어와 .dockerignore 파일 활용 실습
    2025년 07월 15일 13시 12분 37초에 업로드 된 글입니다.
    작성자: DandyNow
    728x90
    반응형

    Dockerfile의 COPY 명령어와 .dockerignore 파일 활용 실습

    1. 서론

    본 글은 Dockerfile 내에서 파일을 이미지로 복사하는 핵심 명령어인 COPY의 다양한 활용 방법과, 빌드 컨텍스트에서 불필요한 파일을 제외하여 이미지 크기를 최적화하는 .dockerignore 파일의 중요성에 대한 실습 내용을 정리한 것이다.

    2. Dockerfile의 COPY 명령어 기본

    2-1. COPY 명령어의 역할

    COPY 명령어는 Dockerfile에서 호스트 시스템(로컬 개발 환경)의 파일이나 디렉토리를 도커 이미지 내부의 컨테이너로 복사하는 데 사용된다. 이는 애플리케이션 코드, 설정 파일, 스크립트 등 컨테이너 실행에 필요한 리소스를 이미지에 포함시키는 기본적인 방법이다.

    2-2. 초기 오류 발생 사례 및 해결

    • 오류 발생: 초기 docker build 과정에서 다음과 같은 오류가 발생하였다.

      ERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref d6bc7d01-5077-421f-a0c5-3605839f1ad2::uyiurteydb1szuz8j5kb2d9js: "/호스트": not found

      이 오류는 Dockerfile의 3번째 줄에 위치한 COPY app.txt /app.txt # 앞 호스트 경로 파일을, 뒤 컨테이너에 app.txt 파일명으로 복사와 같이 한글 주석이 COPY 명령어 뒤에 붙어 있었기 때문에 발생한 것이다. Docker 빌드 시스템이 주석 내의 비-ASCII 문자를 파일 경로의 일부로 오인하여 유효하지 않은 경로로 인식한 것으로 판단된다.

    • 오류 해결: 해당 한글 주석을 제거함으로써 문제는 해결되었다.

      FROM ubuntu
      
      COPY app.txt /app.txt
      
      ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
    • 주석 사용 시 유의사항: Dockerfile 내에서 # 문자를 사용하여 주석을 작성할 수 있으나, 특정 환경(특히 Windows 또는 유니코드 문자를 포함하는 시스템)에서는 비-ASCII 문자가 포함된 주석이 예상치 못한 빌드 문제를 야기할 수 있음을 인지하고 영문으로 작성하는 것이 안전하다.

    3. COPY 명령어의 다양한 활용

    COPY 명령어는 COPY <소스 경로> <대상 경로>의 기본 형식을 따른다. 여기서 소스 경로는 빌드 컨텍스트(일반적으로 docker build 명령이 실행되는 디렉토리)를 기준으로 하며, 대상 경로는 컨테이너 내부의 절대 경로이다.

    3-1. 특정 파일 복사

    • 예시: COPY app.txt /app.txt
    • 설명: 빌드 컨텍스트의 루트에 있는 app.txt 파일을 컨테이너 이미지 내부의 /app.txt 경로로 복사한다.

    3-2. 디렉토리 복사

    • 예시: COPY my-app /my-app/
    • 설명: 빌드 컨텍스트 내의 my-app 디렉토리와 그 하위의 모든 파일 및 서브 디렉토리를 컨테이너 이미지 내부의 /my-app/ 경로로 복사한다.
    • 확인:
      docker run -d my-server
      docker exec -it [컨테이너 ID] bash
      ls /my-app
      cat /my-app/config.txt
      docker exec 명령을 통해 컨테이너 내부에 접속하여 my-app 디렉토리와 그 안에 복사된 파일(예: config.txt)을 확인할 수 있다.

    3-3. 와일드카드를 사용한 파일 복사

    • 예시: COPY *.txt /text-files/
    • 설명: 빌드 컨텍스트 내의 현재 디렉토리에서 .txt 확장자를 가진 모든 파일을 컨테이너 이미지 내부의 /text-files/ 디렉토리로 복사한다.
    • 확인:
      docker run -d my-server
      docker exec -it [컨테이너 ID] bash
      ls /text-files
      컨테이너 내부에서 ls /text-files 명령을 통해 app.txt, readme.txt, text.txt와 같이 복사된 텍스트 파일들을 확인할 수 있다.

    3-4. 현재 디렉토리 전체 복사

    • 예시: COPY ./ /
    • 설명: 빌드 컨텍스트의 모든 내용(현재 디렉토리와 그 하위의 모든 파일 및 서브 디렉토리)을 컨테이너 이미지의 루트 디렉토리 /로 복사한다. 이 명령은 .dockerignore 파일에 의해 제외된 항목을 제외하고 모든 것을 복사한다.
    • 확인:
      docker run -d my-server
      docker exec -it [컨테이너 ID] bash
      ls /
      컨테이너의 루트 디렉토리에서 Dockerfile, app.txt, my-app 디렉토리 등 빌드 컨텍스트의 모든 파일과 디렉토리가 복사된 것을 확인할 수 있다.

    4. .dockerignore 파일의 중요성

    .dockerignore 파일은 Docker 빌드 시 컨테이너 이미지에 포함되어서는 안 되는 파일이나 디렉토리를 지정하는 데 사용된다. 이는 빌드 컨텍스트에서 불필요한 데이터를 제외하여 빌드 속도를 최적화하고 최종 이미지의 크기를 줄이는 데 기여한다.

    .dockerignore 파일에 지정된 패턴과 일치하는 파일 및 디렉토리는 Docker 클라이언트가 Docker 데몬으로 빌드 컨텍스트를 전송할 때 제외된다. 일반적으로 이 파일은 빌드 컨텍스트의 루트에 위치하며, 그 안에 정의된 패턴은 재귀적으로 적용된다.

    본 실습 과정에서 readme.txt 파일이 .dockerignore에 명시되어 있었음에도 불구하고, COPY *.txt /text-files/ 명령을 통해 컨테이너 내의 /text-files/ 경로에 readme.txt가 복사된 사례가 관찰되었다. 이는 .dockerignore 파일의 적용 범위와 COPY 명령의 상호작용에 대한 깊이 있는 이해가 필요함을 시사한다.

    5. 결론

    DockerfileCOPY 명령어는 컨테이너 이미지를 구성하는 데 있어 필수적인 기능이다. 파일 경로 지정, 와일드카드 사용, 디렉토리 복사 등 다양한 활용법을 숙지하는 것이 효율적인 이미지 빌드에 중요하며, .dockerignore 파일을 적절히 활용하여 불필요한 파일을 빌드 컨텍스트에서 제외하고 이미지 크기를 최적화할 수 있다. 또한, Dockerfile 작성 시 주석 사용에 있어서 문자 인코딩과 관련된 잠재적 문제를 인지하고 주의하는 것이 권장된다.

    728x90
    반응형
    댓글