Dockerfile'daki bir dosyayı KOPYALAMAK, böyle bir dosya veya dizin yok mu?


94

Kök (~) klasörümde kurulu bir Dockerfile var. Dosyamın ilk üç satırı şöyle görünüyor:

COPY file1 /root/folder/
COPY file2 /root/folder/
COPY file3 /root/folder/

ancak her satır için aşağıdaki hatayı döndürür:

Böyle bir dosya ya da dizin yok

Dosyalar, Dockerfile'ım ile aynı dizinde ve ben de komutu docker build - < Dockerfileterminalde aynı dizinde çalıştırıyorum .

Burada tam olarak ne yapıyorum?


Bu sorunu yaşadım, sonra .dockerignore dosyasının kopyalamaya çalıştığım dosyayı görmezden geldiğini fark ettim. Çözüm: jinschubert: github.com/docker/for-mac/issues/1922
JStrahl

Yanıtlar:


35

İçinde KOPYA talimat Dockerfiledosyaları kopyalar srciçin destklasöre. Sizin gibi görünüyor ya eksik file1, file2ve file3ya inşa etmeye çalışıyoruz Dockerfileyanlış klasöründen.

Dockerfile Belgesine bakın

Ayrıca inşa etme komutu Dockerfilegibi bir şey olmalıdır.

cd into/the/folder/
docker build -t sometagname .

3
Bu ikinci komut benim için başarısız oluyor, "inşa etmenin" bir argüman gerektirdiğini söylüyor.
GreenGodot

oh - cmd'yi şimdi güncelleyin, Dockerfile'dan bahsetmek gerekmez.
2015 21:25

3
Bağlantınızı doğru bir şekilde okuduktan sonra DockerFile'ın kök klasörde olmaması gerektiğini öğrendim. Her şeyi alt dizine taşıdı, inşa komutunu çalıştırdı ve çalışıyor. Cevabınız çok yardımcı oldu, bu yüzden doğru olarak işaretleyeceğim.
GreenGodot

48
Ayrıca bir Docker Ignore dosyası olup olmadığını kontrol edin.
Tony

252

.dockerignoreDosyayı da kontrol edin .

Bunun çok nadir bir durum olduğunu biliyorum ama o dosyadan orada bahsetmiştim.


3
aman tanrım teşekkür ederim Bir Java projesinin adını değiştiriyordum (ve dolayısıyla artifact ve build dir) ve ripgrepdotfiles içinde arama yapmadığım için eski dizine yapılan son sinir bozucu referansı görmedim.
Martin Lehmann

4
uyarı için teşekkürler, benim durumumda docker için görsel stüdyo sihirbazını kullanıyordum ve ilk satıra * ile bir .dockerignore ekledi :(
lacripta

Bazı nedenlerden dolayı, varsayılan .dockerignore'umun içinde ** \ bin var. Eminim Docker masaüstü tarafından oluşturulmuştur.
Steve Smith

ahhghgghghg, sonuçta o kadar da nadir bir durum değil gibi görünüyor !!!. Bunu bir milyon yıl içinde çözemezdi. Dizini bir süre önce ekledi ve tamamen unuttum.
Eklemenin

1
oh cidden, bu ne hata. buna işaret ettiğiniz için çok teşekkürler!
taiBsu

36

Muhtemelen dosya1 / dosya2 / dosya3'ü derleme bağlamında olmayan mutlak bir yol olarak belirtmenizden kaynaklanıyor olabilir, Docker yalnızca derleme bağlamında yolu arar.

Örneğin, COPY / home / adınız / dosya1 kullanırsanız, Docker build onu $ {docker build çalışma dizini} / home / adınız / dosya1 olarak yorumlar, burada aynı ada sahip bir dosya yoksa, dosya veya dizin hatası atılmaz.

Docker sorunlarından birine başvurun


bir çeşit mutlak yol problemi var, sadece "göreli / yol / x KOPYALA" yapabilirim. "KOPYALA / mutlak / yol / y" yapamıyorum, kimse nedenini biliyor mu?
Alexander Mills

8
@AlexanderMills Dockerfiles'ın ana makinede bağımsız olarak çalıştırılabilir olması ve Dockerfile ile ilgili yollarda bulunan ek dosyalarla birlikte gönderilmesi gerekiyor. Mutlak yollar kullanmak, onu yalnızca makinenizde çalıştırılabilir hale getirir.
kciesielski

ADDDirektifle ilgili sorunum da buydu , teşekkürler.
vmonteco

Bunu bilmiyordum. Dosyayı dockerfile ile birlikte içerecek şekilde değiştirmek aslında benim için mükemmel çalıştı. Başka bir kaynak konumundan aldığımda (tam yol olarak, örneğin / dir / dir2 / dosya) çalışmıyordu. Dockerfile olarak bir dizinde veya alt dizindeyse çalışır
Newteq Developer

22

Görünüşe göre komutlar:

docker build -t imagename .

ve:

docker build -t imagename - < Dockerfile2

aynı şekilde yürütülmez. Dockerfile ve Dockerfile2 ile bir klasörün içinden 2 docker görüntüsü oluşturmak istiyorsanız, COPY komutu stdin (<Dockerfile2) kullanılarak ikinci örnekte kullanılamaz. Bunun yerine şunları kullanmalısınız:

docker build -t imagename -f Dockerfile2 .

O zaman COPY beklendiği gibi çalışır.


16

Çalıştırmak docker build . -f docker/development/Dockerfileçalıştı, bu da docker dosyanızı uygulamanızın kökü dışındaki belirli bir dizinden çalıştırmanıza olanak tanır.

Adını ve konumunu belirtmek için -fveya tuşunu kullanın .--fileDockerfile

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ı.

Benim için docker build docker/development/Dockerfilebu soruna neden olan buydu.

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


1
docker build . -f docker/development/Dockerfilebu işe
yarar

1
Çok teşekkür ederim - bu benim için de çalıştı. bu beni deli ediyor.
x0n

4

Bu sorunu yeni yaşadım ve buradaki önerilerden hiçbiri sorunumu çözmedi. Dosyamda yanlış satır sonlarına sahip olduğum ve bunları uygun satır sonlarıyla değiştirmek zorunda olduğum ortaya çıktı. (Bu durumda CRLF'den LF'ye, bu nedenle Ubuntu 14.04, pencerelerde düzenlemekte olduğum komut dosyasını tanıyacaktı.)

VSCode kullanarak satır sonlarını değiştirdim ve çoğu kod editörünün satır sonlarını seçme seçeneği olmalıdır.

Umarım bu birine yardımcı olur.


Evet, yardımcı oldu :)
Robert Smith

3

Kendimi biraz aptal hissediyorum, ancak sorunum docker-compose çalıştırıyor olmam ve Dockerfile'ım bir ./deploy alt dizinindeydi. ADD referansımın Dockerfile ile değil projenin köküne göre olması gerekiyordu.

Değiştirildi: ADD ./file.tar.gz / etc / folder / to: ADD ./deploy/file.tar.gz / etc / klasör /

Her neyse, birinin aynı sorunla karşılaşması durumunda göndereceğimi düşündüm.


3

İşte çözüm ve en iyi uygulama:

Kopyalamak istediğiniz tüm dosyalarınızı saklayabileceğiniz bir kaynaklar klasörü oluşturmanız gerekir.

├── Dockerfile
│   └── resources
│       ├── file1.txt
│       ├── file2.js

Dosyaları kopyalama komutu şu şekilde belirtilmelidir:

COPY resources /root/folder/

nerede

* kaynaklar - Dockerfile'ın bulunduğu klasörde oluşturduğunuz yerel klasörünüz

* / root / klasör / - konteynerinizdeki klasör


1

Aşağıdaki hata için,

COPY failed: stat /<**path**> :no such file or directory

Docker hizmetini yeniden başlatarak sorunu çözdüm.

sudo service docker restart

1

Docker put_archive ile dosya bulunamadı hatası. Docker için Python API kullanıyorum. Docker sürüm 1.12.5, derleme 7392c3b

docker.errors.NotFound: 404 Client Error: Not Found ("lstat /var/lib/docker/aufs/mnt/39d58e00519ba4171815ee4444f3c43d2c6a7e285102747398f6788e39ee0e87/var/lib/neo4j/certificates: no such file or directory")

Dosyaları oluşturulmuş bir docker kapsayıcısına kopyalayamıyorum.

con = cli.create_container(...)
cli.put_archive(...)
cli.start(con['Id'])

İşlem sırasını değiştirirsem hata olmaz ve dosyalar tam istediğim yere kopyalanır. Bu yüzden kodumun çalıştığını ve yapmasını istediğim şeyi yaptığını biliyorum. Ancak yapılandırma dosyalarını başlatmadan önce bir kaba kopyalamak önemlidir. Dosyaların başlangıçtan sonra kopyalanması, kapsayıcı başlatılmadan önce yerine kopyalanması gereken özel yapılandırma yerine, kapsayıcının varsayılan bir yapılandırma ile başlamasına neden olur. Docker, bu sorunun kapandığını iddia ediyor ancak yine de uygulamamı etkiliyor.

Bu çalışıyor; Aynı kod farklı yürütme sırası.

con = cli.create_container(...)
cli.start(con['Id'])
cli.put_archive(...)

1

Doğru şeyi yaptığınızdan eminseniz, ancak liman işçisi hala şikayet ediyorsa, bu konuya bir göz atın: https://github.com/moby/moby/issues/27134 .
Bu beni yandı ve docker motorunu yeniden başlatmak service docker restartbu sorunu çözecek gibi görünüyor .


1

Bu konuda bir düzeltme arıyordum ve EKLEDİĞİM veya KOPYALA'ladığım klasör yapı klasöründe değildi, birden fazla dizin yukarıda veya / dan başvuruluyordu.

Klasörü yapı klasörünün dışından yapı klasörüne taşımak sorunumu çözdü.


1

stdin'i kullanmamanın ve bağlamı korumanın yollarından biri şudur:

1) Dockerfile dosyanıza eklemelisiniz

ADD /your_dir_to_copy /location_in_container

2) sonra, / your_dir_to_copy dizininin üst kısmına gitmelisiniz

2) sonra bu komutu çalıştırın

sudo docker build . -t (image/name) -f path_of_your_dockerfile/Dockerfile

3) konteynerinizi oluşturduktan sonra

docker run -ti --rm cordova bash

4) Dizininizi konteynırınıza kopyaladıktan sonra


1

COPY üzerindeki önceki aramalar dizini değiştiriyor olabilir.

COPY ./server/package.json ./server      # this passes, but the dest ./server is considered a file

COPY ./server/dist ./server/dist         # error, ./server/dist is not a directory

İlk çağrıya sondaki eğik çizgi ekleyin

COPY ./server/package.json ./server/

1

Ben bununla karşılaştım. Bazı dizinleri kopyalamak işe yaramadı. Dosyaları kopyaladım. Bunun nedeni .gitignore içinde bulunan dosyaların (sadece .dockerignore değil) da göz ardı edilmesidir. Bakınız: https://github.com/zeit/now/issues/790


KOPYALAMANIN kopyalanmaması için düzinelerce referans - bu, .dockerignoresuçlu olarak atıfta bulunulan birkaç referanstan biri
Alvin

1

Bunun eski olduğunu biliyorum, ama belirtilmesi gereken bir şey. Her şeyin olması gerektiği gibi olduğunu düşünüyorsanız, .gitignore dosyanızı kontrol edin :)

Klasöre yerel olarak sahip olabilirsiniz, ancak klasör git'inizdeyse, sunucuda yok, yani Docker bu klasörü bulunmadığından bulamaz.


1

Benzer ve tslegaitis'in cevabına teşekkürler , sonra

gcloud builds submit --config cloudbuild.yaml . 

gösteriyor

Check the gcloud log [/home/USER/.config/gcloud/logs/2020.05.24/21.12.04.NUMBERS.log] to see which files and the contents of the
default gcloudignore file used (see `$ gcloud topic gcloudignore` to learn
more).

Bu günlüğü kontrol etmek, docker'ın şunları kullanacağını söylüyor .gitignore:

DATE Using default gcloudignore file:
# This file specifies files that are *not* uploaded to Google Cloud Platform
# using gcloud. It follows the same syntax as .gitignore, with the addition of
# "#!include" directives (which insert the entries of the given .gitignore-style
# file at that point).
# ...

.gitignore

Bu yüzden düzelttim .gitignore(onun yerine beyaz liste olarak kullanıyorum) ve docker dosyayı kopyaladı.

[Cevabı, yorum yapacak kadar itibarım olmadığı için ekledim]


1

Kaynak dizinim doğru yapı bağlamında olmasına rağmen bu sorunu yaşadım. Bunun nedeni, kaynak dizinimin yapı bağlamının dışındaki bir konuma sembolik bir bağlantı olmasıydı.

Örneğin Dockerfile dosyam şunları içerir:

COPY dir1 /tmp

Eğer dir1bir sembolik bağ COPYkomut benim durumumda çalışmıyor.


0

Yani bu kısa süre önce birkaç kez oldu. Bir .Net dev gibi kullanarak Visual Studio ben benim yapı adını değiştirdi SomeThingiçin SomethingDLL adı olarak ama bu hangi kalır .Csproj dosyasını değiştirmezSomeThing.csproj

Dockerfile, linux büyük / küçük harf duyarlı dosya adlarını kullanır, bu nedenle yeni otomatik oluşturulan Dockerfile, Something.csprojbulamadığı bir şeyi kopyalamaya çalışıyordu . Yani bu dosyayı manuel olarak yeniden adlandırmak (küçük harf yapmak) her şeyi

Ama ... işte uyarıcı bir uyarı. Windows dizüstü bilgisayarımdaki bu dosya adı değişikliği Git tarafından alınmıyor, bu nedenle repo kaynağı hala SomeThing.csprojdepodaydı ve CI / CD işlemi sırasında Docker yapısı aynı nedenlerden dolayı başarısız oldu ...

Dosya adını doğrudan depoda bir taahhüt olarak değiştirmek zorunda kaldım .... kötü, küçük bir çözüm ama gitmemi sağladı

tl; dr Windows O / S üzerinde dosya adı büyük / küçük harf duyarlılığını kontrol edin ve yerel dosya yeniden adlarının Git değiştikçe alınmadığını unutmayın, bu nedenle CI / CD kullanıyorsanız deponuzun da değiştirildiğinden emin olun


0

Şimdiden burada bazı harika cevaplar. Benim için işe yarayan şey yorumları bir sonraki satıra taşımaktı.

KÖTÜ :

WORKDIR /tmp/app/src # set the working directory (WORKDIR), so we can reference program directly instead of providing the full path.
COPY src/ /tmp/app/src/ # copy the project source code

İYİ :

WORKDIR /tmp/app/src
  # set the working directory (WORKDIR), so we can reference program directly instead of providing the full path.
COPY src/ /tmp/app/src/
  # copy the project source code
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.