도커 파일에서 '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
, 디렉토리의 경우
ADD
COPY
.
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로 생성)로 설정할 수 있습니다.
COPY
하지<src>
URL 구성표를 사용합니다.COPY
압축 파일의 압축을 풀지 않습니다.
위해서instruction <src> <dest>
,한다면<src>
압축 이며 타압파 이고일입니다.<dest>
후행 슬래시로 끝나지 않음:
ADD
<dest>
및 풀기<src>
게하.
COPY
<dest>
서류철과 서면으로<src>
게하.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
'programing' 카테고리의 다른 글
gitdiff를 stdout에 쓰도록 하는 방법은? (0) | 2023.08.25 |
---|---|
재료 각도에서 파지네이터를 사용하는 방법은 무엇입니까? (0) | 2023.08.20 |
UITableView에서 셀을 선택할 수 없도록 만드는 방법은 무엇입니까? (0) | 2023.08.20 |
기본 매개 변수가 있는 저장 프로시저 (0) | 2023.08.20 |
브라우저별 AJAX(XmlHttpRequest) 시간 초과 길이 (0) | 2023.08.20 |