programing

도커 파일에서 'COPY' 명령과 'ADD' 명령의 차이점은 무엇입니까?

bestprogram 2023. 8. 20. 12:20

도커 파일에서 'COPY' 명령과 'ADD' 명령의 차이점은 무엇입니까?

사이의 차이점은 무엇입니까?COPY그리고.ADD도커 파일에 있는 명령을 사용할 수 있습니다. 그리고 언제 하나를 다른 하나 위에 사용합니까?

COPY <src> <dest>

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

ADD <src> <dest>

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

그들의 행동에 대한 보다 자세한 설명은 및 설명서를 확인해야 하지만, 간단히 말해서, 가장 큰 차이점은ADD보다 더 많은 것을 할 수 있습니다.COPY:

  • ADD을 지정합니다.<src> URL이 되다이
  • 하면, 아래댓글참면하고을,면▁the,ADD 설명서에는 다음이 명시되어 있습니다.

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

Docker 파일을 작성하는 모범 사례에서는 다음을 사용할 것을 권장합니다.COPY 이 걸린 곳ADD필요하지 않습니다.그렇지 않으면, 당신은 ( 답변을 찾아봐야 했기 때문에) 언젠가 당신이 복사하려고 할 때 놀랄 것입니다.keep_this_archive_intact.tar.gz파일 시스템에 내용물을 뿌립니다.

COPY이라

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

소스 코드에서 직접 참조.

그 점에 대한 몇 가지 공식 문서가 있습니다.도커 파일 작성 모범 사례

중요하기 에 이지크중요때사문용을 사용하는 것.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

, 디렉토리의 경우ADDCOPY.

Docker 문서에서:

추가 또는 복사

ADD와 COPY는 기능적으로 유사하지만 일반적으로 COPY가 선호됩니다.이는 ADD보다 투명하기 때문입니다. COPY는 컨테이너에 로컬 파일의 기본 복사만 지원하는 반면 ADD는 로컬 전용 tar 추출 및 원격 URL 지원과 같은 일부 기능을 제공합니다.따라서 ADD에 가장 적합한 사용 방법은 ADD rootfs.tar.xz /에서와 같이 로컬 tar 파일을 이미지로 자동 추출하는 것입니다.

추가: 도커 파일 작성 모범 사례

를 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의 경우:

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

ADD는 로컬 전용 타르 추출을 지원합니다.이 외에도 복사는 세 개의 레이어를 사용하지만 ADD는 한 개의 레이어만 사용합니다.

Docker 파일을 만들 파일/디렉토리를 복사하는 사용할 수 있는 가지 명령이 있습니다. 및 . 기능 범위에 약간의 차이가 있지만 기본적으로 동일한 작업을 수행합니다.

그렇다면, 왜 우리는 두 개의 명령을 가지고 있고, 우리는 언제 하나 또는 다른 명령을 사용해야 하는지 어떻게 알 수 있을까요?

도커ADD

===

명령어가 이전 버전보다 오래되었다는 점부터 알아보겠습니다. 도커 플랫폼이 출시된 이후로 명령어 목록의 일부로 사용되고 있습니다.

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

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

ADD <src> … <dest>

여기에는 <src>복사할 원본()과 저장할 대상()<dest>이 차례로 포함됩니다.원본이 디렉터리인 경우 파일 시스템 메타데이터를 포함하여 디렉터리 내부의 모든 내용을 복사합니다.

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

ADD /source/file/path  /destination/path

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

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

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

ADD source.file.tar.gz /temp

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

도커COPY

===

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

밀접하게 관련된 명령과 달리 에서는 하나의 기능만 할당됩니다.지정된 위치의 파일/디렉토리를 기존 형식으로 복제하는 역할을 합니다.즉, 압축 파일의 압축을 푸는 것이 아니라 그대로 복사합니다.

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

용방법을 COPY지침은 기본 명령 형식을 따릅니다.

다음과 같이 원본과 명령어를 입력하여 내용을 추출할 위치를 입력합니다.

COPY <src> … <dest> 

예:

COPY /source/file/path  /destination/path 

사용할 명령어(모범 사례)

명령어가 도입된 상황을 고려할 때, 보관이 필요한 문제였음이 분명합니다.Docker는 Docker 파일을 작성하기 위한 모범 사례를 설명하는 공식 문서를 발표했으며, 이 문서는 명령을 사용하지 않도록 명시적으로 조언합니다.

도커의 공식 문서는 보다 투명하기 때문에 항상 필수 지침이 되어야 한다고 언급합니다.

로컬 빌드 컨텍스트에서 컨테이너로 복사해야 하는 경우 를 계속 사용합니다.

또한 Docker 팀은 URL에서 패키지를 다운로드하고 복사하는 데 사용하는 것을 강력히 권장합니다.대신 명령 내에서 wget 또는 curl을 사용하는 것이 더 안전하고 효율적입니다.이렇게 하면 추가 이미지 계층을 생성하지 않고 공간을 절약할 수 있습니다.

참조: https://phoenixnap.com/kb/docker-add-vs-copy

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

ADD 호스트에서 이미지로 파일/디렉토리를 복사할 뿐만 아니라 원격 URL을 가져오거나 TAR 파일을 추출할 수도 마찬가지입니다.

파일 및/또는 디렉토리를 빌드 컨텍스트에 복사하는 데 사용합니다.

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

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

"추가와 복사는 기능적으로 유사하지만 일반적으로 복사를 선호합니다.이는 ADD보다 투명하기 때문입니다. COPY는 컨테이너에 로컬 파일의 기본 복사만 지원하는 반면 ADD는 로컬 전용 tar 추출 및 원격 URL 지원과 같은 일부 기능을 제공합니다.따라서 ADD에 가장 적합한 사용 방법은 ADD rootfs.tar.xz /에서와 같이 로컬 tar 파일을 이미지로 자동 추출하는 것입니다.

컨텍스트와 다른 파일을 사용하는 도커 파일 단계가 여러 개 있는 경우 한 번에 모두 복사하는 것이 아니라 개별적으로 복사합니다.이렇게 하면 특정 필수 파일이 변경된 경우에만 각 단계의 빌드 캐시가 무효화됩니다(단계를 다시 실행하도록 강제함).

예:

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

따라서 실행 단계 앞에 COPY . /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 자동 추출 기능이 필요하지 않은 다른 항목(파일, 디렉토리)의 경우 항상 복사를 사용해야 합니다."

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

복사와 추가는 모두 비슷한 용도로 사용되는 도커 파일 명령입니다.특정 위치의 파일을 Docker 이미지로 복사할 수 있습니다.

복사는 src와 대상을 사용합니다.호스트(도커 이미지를 빌드하는 시스템)의 로컬 파일 또는 디렉터리만 도커 이미지 자체에 복사할 수 있습니다.

ADD를 사용하면 이 작업도 수행할 수 있지만 다른 두 가지 소스도 지원합니다.먼저 로컬 파일/디렉토리 대신 URL을 사용할 수 있습니다.두 번째로, 소스에서 대상으로 직접 tar 파일을 추출할 수 있습니다.

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

로컬 파일을 도커 이미지로 복사하는 경우에는 항상 복사를 사용하십시오. 복사가 더 명확하기 때문입니다.

17 이후 버전 17.05 이후COPY는 에사용다니와 됩니다.--from이전 빌드 단계의 아티팩트를 현재 빌드 단계로 복사하기 위한 다단계 빌드의 플래그입니다.

문서에서.

" 적으로복허용다니합플를선그래택사는▁a▁flag▁option"를 사용할 수 있습니다.--from=<name|index>소스 위치를 사용자가 보낸 빌드 컨텍스트 대신 사용할 이전 빌드 단계(FROM ... AS로 생성)로 설정할 수 있습니다.

  1. COPY하지 <src>URL 구성표를 사용합니다.
  2. COPY압축 파일의 압축을 풀지 않습니다.
    위해서instruction <src> <dest>,한다면<src> 압축 이며 타압파 이고일입니다.<dest>후행 슬래시로 끝나지 않음:
    ADD<dest> 및 풀기<src> 게하.
    COPY<dest>서류철과 서면으로<src> 게하.
  3. COPY빌드 컨텍스트 덮어쓰기 지원--from

ADD명령은 로컬 또는 원격 원본에서 파일 또는 폴더를 복사하여 컨테이너의 파일 시스템에 추가합니다.로컬 파일을 복사하는 데 사용되었습니다. 파일은 작업 디렉토리에 있어야 합니다.ADD명령 패키지를 로컬에서.tar파일을 대상 이미지 디렉토리에 저장합니다.

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

COPY작업 디렉터리에서 파일을 복사하여 컨테이너의 파일 시스템에 추가합니다. 사용원파복수없다사습니를 사용하여 할 수 .URL이 도커 파일 지침을 사용합니다.

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

foo.tar.gz 파일이 있는 경우 다음 명령을 비교합니다.ADD 명령은 복사 명령보다 적은 수의 레이어를 생성하고 도커 이미지를 푸시할 때 많은 양의 넷 트래픽을 절약합니다.

ADD foo.tar.gz /
COPY foo.tar.gz /
RUN tar -zxvf foo.tar.gz
RUN rm -rf foo.tar.gz

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

하지만 당신이 ADD를 사용하면 도커가 모든 것을 처리하고 중간 이미지 하나만 생성됩니다.

ADD와 COPY 둘 다 원본에서 대상으로 파일 및 디렉터리를 복사하는 기능이 동일하지만 ADD에는 파일 추출 및 URL 파일 추출 기능이 추가로 있습니다.가장 좋은 방법은 복사 작업에서만 복사를 사용하는 것입니다. ADD가 많은 영역을 차지하지 않도록 하십시오.링크는 도커 파일에서 복사와 추가의 몇 가지 간단한차이로 설명할 것입니다.

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

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

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

또한 컬 및 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

언급URL : https://stackoverflow.com/questions/24958140/what-is-the-difference-between-the-copy-and-add-commands-in-a-dockerfile