Bir Dockerfile oluştururken, dosyaları / dizinleri içine kopyalamak için kullanabileceğiniz iki komut vardır - ADDve COPY. İşlevlerinin kapsamı arasında küçük farklılıklar olsa da, aslında aynı görevi yerine getirirler.
Peki, neden iki komutumuz var ve birini veya diğerini ne zaman kullanacağımızı nasıl biliyoruz?
DOCKER ADDKOMUTANLIĞI
ADDKomutun daha eski olduğunu belirterek başlayalım COPY. Docker platformunun lansmanından bu yana, ADDtalimat komutlar listesinin bir parçası olmuştur.
Komut dosyaları / dizinleri belirtilen kapsayıcıdaki bir dosya sistemine kopyalar.
ADDKomutun temel sözdizimi :
ADD <src> … <dest>
Kopyalamak istediğiniz kaynağı ( <src>) ve ardından saklamak istediğiniz hedefi ( <dest>) içerir. Kaynak bir ADDdizinse içindeki her şeyi kopyalar (dosya sistemi meta verileri dahil).
Örneğin, dosya yerel olarak kullanılabiliyorsa ve dosyayı bir görüntünün dizinine eklemek istiyorsanız, şunu yazın:
ADD /source/file/path /destination/path
ADDURL'den de dosya kopyalayabilir. Harici bir dosya indirebilir ve istenen hedefe kopyalayabilir. Örneğin:
ADD http://source.file/url /destination/path
Ek bir özellik, sıkıştırılmış dosyaları kopyalaması ve verilen hedefteki içeriği otomatik olarak çıkarmasıdır. Bu özellik yalnızca yerel olarak depolanan sıkıştırılmış dosyalar / dizinler için geçerlidir.
ADD source.file.tar.gz /temp
Sıkıştırılmış bir dosyayı / dizini bir URL'den indiremeyeceğinizi ve çıkaramayacağınızı unutmayın. Komut, yerel paketleri sisteme kopyalarken harici paketleri açmaz.
DOCKER COPYKOMUTANLIĞI
Bazı işlevsellik sorunları nedeniyle Docker, içeriği çoğaltmak için ek bir komut vermek zorunda kaldı COPY.
Yakından ilişkili ADDkomutunun aksine COPY, yalnızca bir atanmış işlevi vardır. Rolü, dosyaları / dizinleri belirli bir konumda varolan biçimlerinde çoğaltmaktır. Bu, sıkıştırılmış bir dosyanın çıkarılmasıyla ilgilenmediği, aksine olduğu gibi kopyaladığı anlamına gelir.
Talimat yalnızca yerel olarak saklanan dosyalar için kullanılabilir. Bu nedenle, harici dosyaları kapsayıcınıza kopyalamak için URL'lerle kullanamazsınız.
COPYTalimatı kullanmak için temel komut biçimini izleyin:
Kaynağı ve komutun içeriği aşağıdaki gibi ayıklamasını istediğiniz yeri yazın:
COPY <src> … <dest>
Örneğin:
COPY /source/file/path /destination/path
Hangi komutu kullanmalı? (En İyi Uygulama)
Komutanın COPYgetirildiği koşullar düşünüldüğünde, tutmanın ADDbir zorunluluk meselesi olduğu açıktır . Docker, Dockerfiles yazmak için en iyi uygulamaları özetleyen resmi bir belge yayınladı.ADD .
Docker'ın resmi dokümantasyonu COPY, her zamankinden daha şeffaf olduğu için her zaman talimat olması gerektiğini not eder ADD.
Yerel derleme bağlamından bir kaba kopyalamanız gerekiyorsa, kullanmaya devam edin COPY.
Docker ekibi ayrıca ADDbir URL'den bir paket indirmek ve kopyalamak için kullanılmasını kesinlikle önermez . Bunun yerine, bir RUNkomut içinde wget veya curl kullanmak daha güvenli ve daha verimlidir . Bunu yaparak, ek bir görüntü katmanı oluşturmaktan kaçınır ve yerden tasarruf edersiniz.