Dockerfile에서 'COPY'와 'ADD'명령의 차이점은 무엇입니까?

docker dockerfile


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

COPY <src> <dest>

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

ADD <src> <dest>

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





Answer 1 icecrime


당신은 확인해야 ADD COPY 자신의 행동에 대한 자세한 설명은 문서를하지만, 간단히 말해서, 주요 차이점은입니다 ADD 가 보다 더 많은 작업을 수행 할 수 있습니다 COPY :

  • ADD<src> 가 URL이되도록합니다
  • 아래 주석을 참조하면 ADD 설명서에 다음과 같이 명시되어 있습니다.

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

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




Answer 2 caike


COPY

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

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




Answer 3 Victor Laskin


그 시점에서 공식 문서가 있습니다 : 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

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




Answer 4 eddd


Docker 문서에서 :

추가 또는 복사

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

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




Answer 5 BertLi


컨테이너 의 /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 개의 레이어 만 사용합니다.