[docker] Dockerfile에서 ‘COPY’와 ‘ADD’명령의 차이점은 무엇입니까?

Dockerfile에서 COPYADD명령 의 차이점은 무엇 이며 언제 다른 것을 사용할 것입니까?

COPY <src> <dest>

COPY 명령어는 새 파일 <src>을 경로의 컨테이너 파일 시스템에 복사 하여 추가합니다.<dest>

ADD <src> <dest>

ADD 명령어는 새 파일 <src>을 path의 컨테이너 파일 시스템에 복사 하여 추가합니다 <dest>.



답변

동작에 대한 자세한 설명은 ADDCOPY설명서를 확인해야 하지만 간단히 말해서 다음과 같은 여러 가지 ADD작업을 수행 할 수 있습니다 COPY.

  • ADD<src>URL이 될 수 있습니다
  • 다음은 주석을 참조하여 ADD 설명서에 다음과 같이 명시되어 있습니다.

    인식 된 압축 형식 (ID, gzip, bzip2 또는 xz)의 로컬 tar 아카이브 인 경우 디렉토리로 압축이 풀립니다. 원격 URL의 리소스는 압축 해제되지 않습니다.

Dockerfile을 작성 하는 모범 사례COPY 는 마법이 ADD필요하지 않은 위치를 사용 하도록 제안 합니다. 그렇지 않으면 ( 이 답변을 찾아야했기 때문에 ) keep_this_archive_intact.tar.gz컨테이너 에 복사하려고 할 때 언젠가 놀랄 것입니다. 대신 파일 시스템에 내용을 뿌립니다.


답변

COPY 이다

‘ADD’와 동일하지만 tar 및 원격 URL 처리가 없습니다.

소스 코드에서 직접 참조 하십시오 .


답변

그 시점에서 공식 문서가 있습니다 : Dockerfile 작성을위한 모범 사례

이미지 크기가 중요하기 때문에 ADD원격 URL에서 패키지를 가져 오는 데 사용 하지 않는 것이 좋습니다. curl또는 wget대신 사용해야 합니다. 그렇게하면 더 이상 필요없는 파일을 추출한 후 삭제할 수 있으며 이미지에 다른 레이어를 추가 할 필요가 없습니다.

RUN mkdir -p /usr/src/things \
  && curl -SL http://example.com/big.tar.gz \
    | tar -xJC /usr/src/things \
  && make -C /usr/src/things all

ADDtar 자동 추출 기능이 필요하지 않은 다른 항목 (파일, 디렉토리)의 경우 항상을 사용해야 COPY합니다.


답변

Docker 문서에서 :

추가 또는 복사

ADD와 COPY는 기능적으로 비슷하지만 일반적으로 COPY가 바람직합니다. ADD보다 투명하기 때문입니다. COPY는 로컬 파일을 컨테이너로 복사하는 기본 기능 만 지원하는 반면 ADD에는 로컬 전용 tar 추출 및 원격 URL 지원과 같은 일부 기능이 즉시 눈에 띄지 않습니다. 결과적으로 ADD를 가장 잘 사용하는 것은 ADD rootfs.tar.xz /에서와 같이 이미지에 로컬 tar 파일 자동 추출입니다.

더보기 : Dockerfile 작성을위한 모범 사례


답변

/usr/local컨테이너에 xx.tar.gz를 추가하려면 압축을 풀고 쓸모없는 압축 패키지를 제거하십시오.

복사의 경우 :

COPY resources/jdk-7u79-linux-x64.tar.gz /tmp/
RUN tar -zxvf /tmp/jdk-7u79-linux-x64.tar.gz -C /usr/local
RUN rm /tmp/jdk-7u79-linux-x64.tar.gz

ADD의 경우 :

ADD resources/jdk-7u79-linux-x64.tar.gz /usr/local/

ADD는 로컬 전용 tar 추출을 지원합니다. 그 외에도 COPY는 3 개의 레이어를 사용하지만 ADD는 1 개의 레이어 만 사용합니다.


답변

COPY 호스트에서 이미지로 파일 / 디렉토리를 복사합니다.

ADD 호스트에서 이미지로 파일 / 디렉토리를 복사하지만 원격 URL을 가져오고 TAR 파일을 추출 할 수도 있습니다 …

COPY파일 및 / 또는 디렉토리를 빌드 컨텍스트로 간단히 복사하는 데 사용하십시오 .

사용 ADD등, 원격 리소스를 다운로드 TAR 파일을 추출하기위한 ..


답변

Docker 문서에서 :
https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#add-or-copy

“ADD와 COPY는 기능적으로 비슷하지만 일반적으로 COPY가 선호됩니다. ADD보다 투명하기 때문입니다. COPY는 로컬 파일을 컨테이너로 복사하는 기본 기능 만 지원하지만 ADD에는 로컬 전용 tar 추출 및 ADD rootfs.tar.xz /에서와 같이 ADD를 가장 잘 사용하는 것은 이미지에 로컬 tar 파일을 자동 추출하는 것입니다.

컨텍스트와 다른 파일을 사용하는 여러 Dockerfile 단계가있는 경우 한 번에 하나씩이 아니라 개별적으로 복사하십시오. 이렇게하면 특별히 필요한 파일이 변경 될 경우 각 단계의 빌드 캐시가 무효화됩니다 (단계를 다시 실행해야 함).

예를 들면 다음과 같습니다.

 COPY requirements.txt /tmp/
 RUN pip install --requirement /tmp/requirements.txt
 COPY . /tmp/

COPY를 넣을 때보 다 RUN 단계에 대한 캐시 무효화가 줄어 듭니다. 그 전에 / tmp /.

이미지 크기가 중요하기 때문에 ADD를 사용하여 원격 URL에서 패키지를 가져 오는 것은 권장하지 않습니다. 대신 curl 또는 wget을 사용해야합니다. 그렇게하면 더 이상 필요없는 파일을 추출한 후 삭제할 수 있으며 이미지에 다른 레이어를 추가 할 필요가 없습니다. 예를 들어 다음과 같은 일을 피해야합니다.

 ADD http://example.com/big.tar.xz /usr/src/things/
 RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
 RUN make -C /usr/src/things all

대신 다음과 같은 작업을 수행하십시오.

 RUN mkdir -p /usr/src/things \
     && curl -SL htt,p://example.com/big.tar.xz \
     | tar -xJC /usr/src/things \
     && make -C /usr/src/things all

ADD의 tar 자동 추출 기능이 필요하지 않은 다른 항목 (파일, 디렉토리)의 경우 항상 COPY를 사용해야합니다. “