Soru Docker COPY sorunu - “böyle bir dosya veya dizin yok”


Dockerfile'ımda aşağıdaki 'COPY' ifadesine sahibim:

# Copy app code
COPY /srv/visitor /srv/visitor

Ev sahibi sistemimde "/ srv / ziyaretçi" dizini altında gerçekten kaynak kodumun olduğunu söylemeden şunu söylemeliyim:

[root@V12 visitor]# ls /srv/visitor/
Dockerfile  package.json  visitor.js

Şimdi, bu Dockerfile'ı kullanarak bir görüntü oluşturmaya çalıştığımda, "COPY" nin gerçekleşmesi beklenen adımda askıda kalıyor:

Step 10 : COPY /srv/visitor /srv/visitor
INFO[0155] srv/visitor: no such file or directory

Böyle bir dizin olmadığını söylüyor, ama açıkça var.

Herhangi bir fikir?

GÜNCELLEME 1:

Yapılandırıldığımı anlamış olmama rağmen yanıldığımı gösterdim. Öneri, "KOPYA" ifadesinin buna göre değişmesiydi:

COPY . /srv/visitor

Sorun şu ki, bu şekilde vardı ve inşa süreci bir sonraki adımda durdu:

RUN npm install

Açık bir tane olduğunda, "package.json dosyası bulunamadı" satırı boyunca bir şey söyledi.

GÜNCELLEME 2:

Dockerfile'daki bu değişiklikle çalıştırmayı denedim:

COPY source /srv/visitor/

Npm'yi çalıştırmaya çalışırken durdu:

Step 12 : RUN npm install
 ---> Running in ae5e2a993e11
npm ERR! install Couldn't read dependencies
npm ERR! Linux 3.18.5-1-ARCH
npm ERR! argv "/usr/bin/node" "/usr/sbin/npm" "install"
npm ERR! node v0.10.36
npm ERR! npm  v2.5.0
npm ERR! path /package.json
npm ERR! code ENOPACKAGEJSON
npm ERR! errno 34

npm ERR! package.json ENOENT, open '/package.json'
npm ERR! package.json This is most likely not a problem with npm itself.
npm ERR! package.json npm can't find a package.json file in your current directory.

npm ERR! Please include the following file with any support request:
npm ERR!     /npm-debug.log
INFO[0171] The command [/bin/sh -c npm install] returned a non-zero code: 34

Yani, kopya yapıldı mı? Varsa, npm niçin package.json'u bulamıyor?


34
2018-02-09 13:48


Menşei


2017'de bir sorun arayanlar için bu sizin sorununuz olabilir github.com/docker/for-mac/issues/1922. Sizi silmenizi önerir. Bu çalışırsa, sorunu çözmek için .dockerignore'daki ayarlarınızla uğraşabilirsiniz. - Undefined


Cevaplar:


Belgelerden:

<src> yol yapının içeriğinde olmalı; Bir docker yapısının ilk adımı, docker artalanına bağlam dizinini (ve alt dizinleri) göndermek olduğundan, KOPYALAYINIZ ../something / bir şey olamaz.

Kullandığında /srv/visitor aslında geçerli dizin olsa bile, yapı bağlamının dışında mutlak bir yol kullanıyorsunuz.

Yapı içeriğinizi şöyle organize etseniz iyi olur:

├── /srv/visitor
│   ├── Dockerfile
│   └── resources
│       ├── visitor.json
│       ├── visitor.js

Ve kullan :

COPY resources /srv/visitor/

31
2018-02-09 13:57



Ana sistemimin "/ srv / visitor" dizininde zaten var ve tüm kaynak kodum ve Dockerfile burada. "COPY" ifademi nasıl yazmalıyım? Böylece tüm bu kaynak, içeriğin "/ srv / visitor" dizininde kopyalanabilsin mi? - dsljanus
@dsljanus Kaynak dizin veya dosya olmalı bağıl yapı bağlamına yani /srv/visitor dizin. - Xavier Lucas
Yani, "" olmalı? Çünkü ben bu şekilde yaptım ve bir sonraki adımda "RUN npm install" ile yapım süreci durdu. "Paket.json dosyası bulunamadı" satırında bir şey söyledi. Lütfen güncellememi de okuyun. - dsljanus
@dsljanus Ve npm nereden çalışıyorsun? Tüm dockerfile gönderin ... Btw, bu gibi birçok güncellemeyi sorularda düzeltmez, bu gerçekten bir problemden tamamen farklı birine atlamak için can sıkıcıdır. SF'nin amacı, açık cevaplar almak için açık sorular sormaktır. - Xavier Lucas
@dsljanus Tamam, sorun bu, kullanma RUN cd ama kullan WORKDIR böylece geçerli dizin her adım arasında hatırlanır. Bir docker dosyası, docker run + docker işlemi için bir sarıcıdan başka bir şey değildir, böylece her adım önceki katman üzerinde bağımsız olarak çalışır. Bu pwd eşittir demektir / Bu yönergeyi kullanmazsanız her adımda. - Xavier Lucas


Benim için dizin doğru bağlamdaydı, sadece (gizli) .dockerignore projenin kökünde dosya. Bu hata mesajına yol açar:

lstat mydir/myfile.ext: no such file or directory

37
2018-05-10 15:11



demek istedin .dockerignore? sadece bana oldu - Martín Coll
Seni korusun! Unuttuğum bir dizini unutmuştum ve yapmamı kırdı. Küçük bir not olarak, bir dizindeki tek bir dosyayı aşağıdaki gibi göz ardı edebilirsiniz: !path/to/my/file Bile path içinde .dockerignore. - hjc1710
Sadece bana da çok sevindim. Teşekkürler! - Matthew Adams
Bu iyi bir tane. - Gudlaugur Egilsson
Bunun için sana ne kadar minnettar olduğumu ifade edemem, geçmiş gün boyunca kendime işkence ettim. Yine de, docker için VS Tools'un içinde * .dockerignore bulunan * bulunamıyor. - bilal.haider


Benim için sorun, kullanmakta olduğum docker build - < Dockerfile

İtibaren belgeleme Not: STDIN kullanarak oluşturursanız (docker build - < somefile), yapı bağlamı yoktur, bu yüzden COPY kullanılamaz.


6
2017-12-15 02:36





Xavier Lucas [son derece yararlı] cevap belirtildiği gibi, sen KOPYA kullanmak veya inşa bağlamı dışında bir dizinden ADD olamaz (aralarından "liman işçisi inşa" çalıştırmak klasöründe, sizin .Dockerfile aynı dizin olmalıdır). Bir link link kullanmayı deneseniz bile işe yaramaz.

Not: Bu POSIX'e özgüdür (Linux, Unix, Mac, Windows için Muhtemelen Linux Alt Sistemi).   JUNCTION kullanarak Windows'da benzer yapabilirsiniz.

cd ~/your_docker_project/
cp -al /subfolder/src_directory ./
echo "COPY src_directory /subfolder/" >> Dockerfile

Tehlike: Bunu kullanarak docker projenizi   konak. Bunu neredeyse hiç yapmak istemiyorsun! Dikkatli tutun.

Uygulama: Bir Geliştirme Ortamında Öğrenme, Deneme

Bu benim için hile yaptı. cp -al dizin yapısını kopyalar ve tüm dosyalar için sabit bağlantılar yapar. İşiniz bittiğinde onu kaldırmak için "rm -rf ./src_directory" komutunu çalıştırın.


1
2018-03-20 17:17



Amacım: Önbelleğe alınmış paketleri yerel dosya sistemimde docker resmime kopyala. İhtiyacım olan araçları yükleyin (önbelleği kullanır veya yenisini indirir). Sonra bu önbelleği görüntüde silerim ve ana bilgisayardaki sabit linkleri silerim. Ev sahibi bu dosyalara sahip değilse, endişelenmeyin. Ancak sınırlı bant genişliği ve sınırlı sürücü alanım var. Bu kabul edilebilir bir kullanım mı? - TamusJRoyce


Bu konuya koşuyordum ve Dockerfile'larımı diğer dizinlerden yüklemek için yapı değişkenine bir bağlam ekleyebileceğimi öğrendim. Bu benim varsayılan Docker dosya yapısını değiştirmekten biraz daha fazla değiştirmeme izin verdi. İşte docker-compose.yml'mden bir snippet:

version: '3'
services:
  webserver:
    build:
      context: .
      dockerfile: ./server/Dockerfile
    ...

Bağlamı ekleyerek dosyaların nereye başvurulması gerektiğini tanımlayabildim. Docker dokümanlarına buradan ulaşabilirsiniz: https://docs.docker.com/compose/compose-file/#context

Bu yardımcı olur umarım!


1
2017-07-27 18:44





Benim için sorun, eklediğim dosya adının sondaki bir boşluğa sahip olmasıydı. Bir isim değiştirdi.


0
2017-10-23 03:28





Aşağıdaki hata için

COPY failed: stat

Docker servisini yeniden başlatarak buldum.


0
2017-07-12 07:03





Sonunda bu sorunu çözdüm davamda Dockerfile kopyalayan proje daha derin bir düzeyde oldu. Bu yüzden, sunucunun yapım yolunun Dockerfile dosyasının dosya konumuna göre ifade edildiğini fark ettim.


0
2017-08-24 13:22