etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2021. 11. 24. 06:13
반응형

질문자 :Steve


COPYADD 명령의 차이점은 무엇이며 언제 다른 명령보다 하나를 사용합니까?

 COPY <src> <dest>

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

 ADD <src> <dest>

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



동작에 대한 더 자세한 설명은 ADDCOPY 문서를 확인해야 ADD COPY 이상을 수행할 수 있다는 것입니다.

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

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

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


icecrime

COPY

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

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


caike

해당 지점에 대한 공식 문서가 있습니다. 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 를 사용해야 합니다.


Victor Laskin

Docker 문서에서:

추가 또는 복사

ADD와 COPY는 기능적으로 유사하지만 일반적으로 COPY가 선호됩니다. ADD보다 투명하기 때문입니다. COPY는 컨테이너에 로컬 파일의 기본 복사만 지원하는 반면 ADD에는 즉시 명확하지 않은 일부 기능(예: 로컬 전용 tar 추출 및 원격 URL 지원)이 있습니다. 결과적으로 ADD의 가장 좋은 용도는 ADD rootfs.tar.xz /에서와 같이 로컬 tar 파일을 이미지로 자동 추출하는 것입니다.

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


eddd

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

복사:

 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 resources/jdk-7u79-linux-x64.tar.gz /usr/local/

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


BertLi

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

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

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

원격 리소스 다운로드, TAR 파일 추출 등에 ADD 를 사용합니다.


JSON C11

Dockerfile을 생성할 때 파일/디렉토리를 복사하는 데 사용할 수 있는 두 가지 명령( ADDCOPY 있습니다. 기능 범위에 약간의 차이가 있지만 본질적으로 동일한 작업을 수행합니다.

그렇다면 왜 두 개의 명령이 있으며 둘 중 하나를 언제 사용해야 하는지 어떻게 알 수 있습니까?

도커 ADD 명령

ADD 명령이 COPY 보다 오래되었다는 점부터 시작하겠습니다. Docker 플랫폼 출시 이후 ADD 명령은 명령 목록의 일부였습니다.

이 명령은 지정된 컨테이너의 파일 시스템에 파일/디렉토리를 복사합니다.

ADD 명령의 기본 구문은 다음과 같습니다.

 ADD <src> … <dest>

여기에는 복사하려는 소스( <src> )와 저장하려는 대상( <dest> )이 포함됩니다. 소스가 디렉토리인 경우 ADD 는 그 안에 있는 모든 항목(파일 시스템 메타데이터 포함)을 복사합니다.

예를 들어, 파일을 로컬에서 사용할 수 있고 이미지 디렉토리에 추가하려면 다음을 입력합니다.

 ADD /source/file/path /destination/path

ADD 는 URL에서 파일을 복사할 수도 있습니다. 외부 파일을 다운로드하여 원하는 대상에 복사할 수 있습니다. 예를 들어:

 ADD http://source.file/url /destination/path

추가 기능은 압축된 파일을 복사하여 지정된 대상의 콘텐츠를 자동으로 추출한다는 것입니다. 이 기능은 로컬에 저장된 압축 파일/디렉토리에만 적용됩니다.

 ADD source.file.tar.gz /temp

URL에서 압축 파일/디렉토리를 다운로드하고 추출할 수 없다는 점을 염두에 두십시오. 이 명령은 외부 패키지를 로컬 파일 시스템에 복사할 때 압축을 풀지 않습니다.

도커 COPY 명령

일부 기능 문제로 인해 Docker는 콘텐츠 복제를 위한 추가 명령인 COPY 를 도입해야 했습니다.

밀접하게 관련된 ADD 명령 COPY 에는 할당된 기능이 하나만 있습니다. 그 역할은 기존 형식으로 지정된 위치에 파일/디렉토리를 복제하는 것입니다. 즉, 압축 파일을 추출하는 것이 아니라 그대로 복사합니다.

명령어는 로컬에 저장된 파일에만 사용할 수 있습니다. 따라서 URL과 함께 사용하여 외부 파일을 컨테이너에 복사할 수 없습니다.

COPY 명령을 사용하려면 기본 명령 형식을 따르십시오.

다음과 같이 명령이 콘텐츠를 추출할 소스와 위치를 입력합니다.

 COPY <src> … <dest>

예를 들어:

 COPY /source/file/path /destination/path

어떤 명령을 사용할 것인가?(모범 사례)

COPY 명령이 도입된 상황을 고려하면 ADD 를 유지하는 것이 불가피한 문제임이 분명합니다. ADD 명령 사용에 대해 명시적으로 조언하는 Dockerfile 작성 모범 사례를 설명하는 공식 문서를 발표했습니다.

Docker의 공식 문서에 따르면 COPY ADD 보다 투명하기 때문에 항상 이동해야 하는 지침이어야 합니다.

로컬 빌드 컨텍스트에서 컨테이너로 복사해야 하는 경우 COPY 사용을 고수하십시오.

ADD 를 사용하여 URL에서 패키지를 다운로드하고 복사하는 것을 강력히 권장하지 않습니다. RUN 명령 내에서 wget 또는 curl을 사용하는 것이 더 안전하고 효율적입니다. 이렇게 하면 추가 이미지 레이어를 생성하지 않고 공간을 절약할 수 있습니다.


Yogi Ghorecha

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

"ADD와 COPY는 기능적으로 유사하지만 일반적으로 COPY가 선호됩니다. 그 이유는 ADD보다 투명하기 때문입니다. COPY는 로컬 파일을 컨테이너로 기본 복사만 지원하는 반면 ADD에는 일부 기능(예: 로컬 전용 tar 추출 및 원격 URL 지원) 결과적으로 ADD의 가장 좋은 용도는 ADD rootfs.tar.xz /에서와 같이 로컬 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를 사용해야 합니다."


jhpg

출처: https://nickjanetakis.com/blog/docker-tip-2-the-difference-between-copy-and-add-in-a-dockerile :

COPY 및 ADD는 둘 다 유사한 목적을 수행하는 Dockerfile 명령입니다. 특정 위치에서 Docker 이미지로 파일을 복사할 수 있습니다.

COPY는 src와 대상을 받습니다. 호스트(Docker 이미지를 빌드하는 머신)에서 Docker 이미지 자체로 로컬 파일 또는 디렉터리만 복사할 수 있습니다.

ADD에서도 그렇게 할 수 있지만 2개의 다른 소스도 지원합니다. 첫째, 로컬 파일/디렉토리 대신 URL을 사용할 수 있습니다. 둘째, 소스에서 대상으로 직접 tar 파일을 추출할 수 있습니다.

ADD의 유효한 사용 사례는 로컬 tar 파일을 Docker 이미지의 특정 디렉터리로 추출하려는 경우입니다.

로컬 파일에서 Docker 이미지로 복사하는 경우 더 명시적이므로 항상 COPY를 사용하십시오.


Shagun Pruthi

Docker 17.05 이후 COPY 는 다단계 빌드 에서 --from 플래그와 함께 사용되어 이전 빌드 단계에서 현재 빌드 단계로 아티팩트를 복사합니다.

문서에서

선택적으로 COPY는 소스 위치를 사용자가 보낸 빌드 컨텍스트 대신 사용할 이전 빌드 단계(FROM .. AS 로 생성)로 설정하는 데 사용할 수 --from=<name|index>


MCI

중요 사항

내 도커 이미지에서 자바 패키지를 COPY ADD를 사용하여 만든 도커 이미지 크기를 비교했을 때 COPY, tar -xzf *.tar.gz 및 rm *.tar.gz를 사용하여 만든 것보다 180MB 더 큽니다.

이것은 ADD가 tar 파일을 제거하더라도 여전히 어딘가에 보관된다는 것을 의미합니다. 그리고 이미지를 더 크게 만드는 것!!


Avi Veltz

  1. COPY 는 URL 구성표가 있는 <src> 를 지원하지 않습니다.
  2. COPY 는 압축 파일의 압축을 풀지 않습니다.
    instruction <src> <dest> 경우 <src> 가 tar 압축 파일이고 <dest> 가 후행 슬래시로 끝나지 않는 경우:
    ADD<dest> 를 디렉토리로 <src> 압축을 풉니다.
    COPY<dest> 를 파일로 <src> 를 씁니다.
  3. --from arg로 빌드 컨텍스트를 덮어쓰는 COPY

Dreamoon

tar 파일이 있고 컨테이너에 넣은 후 압축을 풀고 제거하려는 경우 COPY 명령을 사용하여 이를 수행할 수 있습니다. 그러나 다양한 명령은 1) tar 파일을 대상으로 복사, 2)입니다. 압축을 풀고 3) tar 파일을 제거합니다. 3단계로 이 작업을 수행한 경우 각 단계 후에 새 이미지가 생성됩니다. &를 사용하여 한 번에 이 작업을 수행할 수 있지만 번거롭습니다.

그러나 ADD를 사용하면 Docker가 모든 것을 처리하고 하나의 중간 이미지만 생성됩니다.


Ankur Kothari

ADD 명령어는 로컬 또는 원격 소스에서 파일이나 폴더를 복사하여 컨테이너의 파일 시스템에 추가합니다. 로컬 파일을 복사하는 데 사용되며 작업 디렉토리에 있어야 합니다. ADD .tar 파일을 대상 이미지 디렉토리에 압축을 풉니다.

예시

 ADD http://someserver.com/filename.pdf /var/www/html

COPY 는 작업 디렉토리에서 파일을 복사하여 컨테이너의 파일 시스템에 추가합니다. 이 Dockerfile 명령으로 URL 을 사용하여 원격 파일을 복사할 수 없습니다.

예시

 COPY Gemfile Gemfile.lock ./ COPY ./src/ /var/www/html/

Gupta

ADD와 COPY는 모두 원본에서 대상으로 파일과 디렉터리를 복사하는 동일한 기능을 가지고 있지만 ADD에는 추가 파일 추출 및 URL 파일 추출 기능이 있습니다. 가장 좋은 방법은 복사 작업에서만 COPY를 사용하는 것입니다. ADD가 많은 영역을 피하는 것입니다. 링크는 dockerfile에서 COPY와 ADD의 차이점 을 몇 가지 간단한 예와 함께 설명합니다.


Ajeeth thangarasu

docker build -t {image name} -v {host directory}:{temp build directory} .

이것은 파일을 이미지로 복사하는 또 다른 방법입니다. -v 옵션은 빌드 프로세스 동안 사용한 볼륨을 임시로 생성합니다.

이것은 빌드 전용 호스트 디렉토리를 마운트하기 때문에 다른 볼륨과 다릅니다. 파일은 표준 cp 명령을 사용하여 복사할 수 있습니다.

또한 curl 및 wget과 마찬가지로 명령 스택(단일 컨테이너에서 실행)에서 실행할 수 있으며 이미지 크기를 곱하지 않습니다. ADD 및 COPY는 독립 실행형 컨테이너에서 실행되고 추가 컨테이너에서 실행되는 해당 파일에 대한 후속 명령은 이미지 크기를 곱하기 때문에 스택할 수 없습니다.

옵션을 다음과 같이 설정하면

 -v /opt/mysql-staging:/tvol

다음은 하나의 컨테이너에서 실행됩니다.

 RUN cp -r /tvol/mysql-5.7.15-linux-glibc2.5-x86_64 /u1 && \ mv /u1/mysql-5.7.15-linux-glibc2.5-x86_64 /u1/mysql && \ mkdir /u1/mysql/mysql-files && \ mkdir /u1/mysql/innodb && \ mkdir /u1/mysql/innodb/libdata && \ mkdir /u1/mysql/innodb/innologs && \ mkdir /u1/mysql/tmp && \ chmod 750 /u1/mysql/mysql-files && \ chown -R mysql /u1/mysql && \ chgrp -R mysql /u1/mysql

Dennis Payne

출처 : http:www.stackoverflow.com/questions/24958140/what-is-the-difference-between-the-copy-and-add-commands-in-a-dockerfile

반응형