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


36

Docker dosyamda şu "COPY" ifadesi var:

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

Barındırma sistemimde, "/ srv / visitor" dizininde, kaynak kodumun gerçekten bulunduğunu söylemem gerek.

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

Şimdi, bu Docker dosyasını kullanarak bir resim oluşturmaya çalıştığımda, "KOPYA" nın gerçekleşmesi gerektiği adımda kilitleniyor:

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:

İçerik oluşturduğumu anladığım gibi yanıldığımı işaret etti. Öneri "COPY" cümlesini şöyle değiştirdi:

COPY . /srv/visitor

Sorun şu ki, bu şekilde yaşadım ve yapım süreci bir sonraki adımda durdu:

RUN npm install

Açıkça bir tane olduğunda, "no package.json dosyası bulunamadı" satırları boyunca bir şeyler söyledi.

GÜNCELLEME 2:

Dockerfile’deki bu değişiklikle çalıştırmayı denedim:

COPY source /srv/visitor/

Npm ç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

Peki, kopya yapıldı mı? Evetse, npm neden package.json 'ı bulamıyor?


2017'de bir sorun arayanlar için - bu sizin sorununuz olabilir github.com/docker/for-mac/issues/1922 . .dockerignore dosyasını silmenizi ve tekrar test etmenizi önerir. Bu işe yararsa, sorunu çözmek için .dockerignore içindeki ayarlarınızla dolaşabilirsiniz.
Tanımsız

Yanıtlar:


35

Belgelerden:

<src>Yol yapı bağlamında içinde olmalıdır ; KOPYA .. / bir şey / bir şey yapamazsınız, çünkü bir liman işçisi yapısının ilk adımı, dizin dizinini (ve alt dizinleri) liman işçisi arka planına göndermek.

Kullandığınızda /srv/visitor, aslında geçerli dizin olsa bile, yapı içeriğinin dışında mutlak bir yol kullanıyorsunuzdur.

Derleme bağlamınızı şöyle organize edersiniz:

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

Ve kullan :

COPY resources /srv/visitor/

Not:

docker build - < Dockerfile herhangi bir bağlamı yok.

Dolayısıyla,

docker build .


Ben zaten ana bilgisayar sistemimin "/ srv / visitor" dizinindeyim ve tüm kaynak kodum artı Dockerfile burada. "COPY" ifademi nasıl yazmalıyım ki tüm bu kaynak konteynerin "/ srv / visitor" dizinine kopyalanmalı?
dsljanus

1
@dsljanus kaynak dizin veya dosya olmalıdır göreli inşa bağlam yani için /srv/visitordizine.
Xavier Lucas,

Öyleyse, "." Olmalı mı? Çünkü o şekilde kaldım ve derleme işlemi bir sonraki adımda durdu, "RUN npm install". "No package.json dosyası bulunamadı" satırları boyunca bir şey söyledi. Lütfen ayrıca güncellememe bakın.
dsljanus

2
@ dsljanus Peki npm'den kaçıyorsunuz? Dockerfile'nizi yayınlayın ... Btw, sorularda bunun gibi birden fazla güncellemeyi değiştirmez, bu bir problemden tamamen farklı bir soruna geçmek gerçekten can sıkıcıdır. SF'nin amacı, net cevaplar alabilmek için açık sorular göndermektir.
Xavier Lucas,

1
@ dsljanus Tamam, sorun bu, kullanmayın RUN cdama WORKDIRmevcut dizin her adım arasında hatırlanacak şekilde kullanın . Bir liman işçisi dosyası, liman işçisi + liman işçisi işlenmesi için bir paketleyiciden başka bir şey değildir, bu nedenle her adım bağımsız olarak önceki katman üzerinde çalışır. Bu /yönergeyi kullanmadığınız takdirde pwd her adımda eşittir demektir .
Xavier Lucas,

39

Benim için dizin doğru bağlamdaydı, sadece .dockerignoreprojenin kök dizinindeki (gizli) dosyaya dahil edildi . Bu hata mesajına yol açar:

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

3
Eğer demek .dockerignore? bu sadece başıma geldi
Martín Coll

5
Seni korusun! Bütün bir dizini unutmuşum, unutmuşum ve yapıyorum. Küçük bir not olarak, bir dizinde tek bir dosya un-sayabilirsiniz: !path/to/my/filedahi pathbulunmaktadır .dockerignore.
hjc1710

Bu iyi bir tane.
Gudlaugur Egilsson

Bunun için sana ne kadar minnettar olduğumu söyleyemem, geçen gün kendime işkence ediyordum. Neden hala docker için VS Tools'un içinde * bulunan bir .dockerignore içerdiğini anlayamıyorum
bilal.haider

7

Benim için sorun şu ki ben kullanıyordum docker build - < Dockerfile

Gönderen dokümantasyon Not: Eğer STDIN (kullanarak inşa halinde docker build - < somefile) KOPYA kullanılamaz böylece, hiçbir yapı bağlam yoktur.


1

Xavier Lucas [son derece yardımcı] cevabının belirttiği gibi, COPY veya ADD'yi build bağlamınızın dışındaki bir dizinden kullanamazsınız ("docker build" komutunu çalıştırdığınız klasör, .Docker dosyanızla aynı olmalıdır). Bir sembolik bağlantı kullanmaya çalışsanız bile çalışmaz.

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

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

Tehlike: Bunun kullanılması liman projenizi ev sahibine özel hale getirir. Neredeyse asla bunu yapmak istemezsin! Dikkatli tutun.

Uygulama: 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 zor linkler oluşturur. İşiniz bittiğinde, kaldırmak için "rm -rf ./src_directory" komutunu çalıştırın.


Amacım: Yerel dosya sistemimde önbelleğe alınmış paketleri docker resmime kopyala. İhtiyacım olan araçları yükleyin (önbelleği kullanır veya yeni indirir). Sonra görüntüdeki önbelleği ve ana bilgisayardaki sabit bağlantıları sildim. Ana bilgisayarda bu dosyalar yoksa, 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ıdır?
TamusJRoyce

1

Bu sorunla karşılaşıyordum ve Dockerfile (ler) i diğer dizinlerden yüklemek için build değişkenine bir bağlam ekleyebildiğimi öğrendim. Bu, varsayılan Docker dosya yapısını istediğimden biraz daha fazla değiştirmeme izin verdi. İşte docker-compose.yml'den bir snippet:

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

Bağlamı ekleyerek dosyaların nereye atıfta bulunacağını tanımlayabildim. Docker belgelerine buradan başvurabilirsiniz: https://docs.docker.com/compose/compose-file/#context

Bu yardımcı olur umarım!


0

Benim için sorun, eklediğim dosya adının sonunda bir boşluk olmasıydı. Bir yeniden adlandırma düzeltildi.


0

Sonraki hata için

COPY failed: stat

Liman işçisi servisini yeniden başlatarak hallettim.


0

Sonunda bu problemi çözdüm, benim projemde daha derin bir seviyedeydi. Böylece, ana makinenin derleme yolunun Dockerfile'in dosya konumuna göre ifade edildiğini fark ettim.


0

Docker dosyasını farklı bir dizinden çalıştırmaya çalışırken bu bana oldu.

Ben COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directoryve liman işçilerinin dosyasını belirterek bu sorunu çözmek için başardı.

Koştum docker build . -f docker/development/Dockerfileçalıştı.

Ancak çalışan Runningliman işçisi inşa liman işçisi / geliştirme / Liman işçisi `bu soruna neden oldu.

-fveya --fileadını ve konumunu belirtmek için Dockerfile.

İlk başta garip buldum çünkü Dockerfileuygulamalar kök dizinindeyken iyi çalıştı. Ortam docker dosyalarınızı biraz daha iyi yönetmek istiyorsanız bu yardımcı olacaktır.


0

Dosya yalnızca geçerli yapı bağlamında bir dizinde olmakla kalmaz, dosya da yapı bağlamı dışındaki bir dosyaya yumuşak bir bağlantı olamaz.

Giriş dizinimdeki bir dosyaya bir bağlantı vardı ve bu bağlantı proje dizinindeydi. Bağlantıyı sildim ve bağlantılı dosyayı projeye ( rm mylink ; mv ~/myrealfile ./) taşıdıktan sonra işe yaradı.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.