MENYALIN file di Dockerfile, tidak ada file atau direktori seperti itu?

94

Saya memiliki Dockerfile yang disiapkan di folder root (~) saya. Tiga baris pertama file saya terlihat seperti ini:

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

tetapi mengembalikan kesalahan berikut untuk setiap baris:

tidak ada berkas atau direktori seperti itu

File-file tersebut berada di direktori yang sama dengan Dockerfile saya dan saya menjalankan perintah docker build - < Dockerfiledi direktori yang sama di terminal juga.

Apa yang salah tepatnya di sini?

GreenGodot
sumber
Saya mengalami masalah ini, kemudian melihat file .dockerignore mengabaikan file yang saya coba salin. Solusi oleh jinschubert: github.com/docker/for-mac/issues/1922
JStrahl

Jawaban:

35

Instruksi COPY dalam Dockerfilemenyalin file srcke destfolder. Sepertinya Anda melewatkan file1, file2dan file3atau mencoba membangun Dockerfiledari folder yang salah.

Lihat Dok Dockerfile

Juga perintah untuk membangun Dockerfileharus seperti ini.

cd into/the/folder/
docker build -t sometagname .
askb
sumber
3
Perintah kedua itu gagal untuk saya, mengatakan bahwa "membangun" membutuhkan satu argumen.
GreenGodot
oh - perbarui cmd sekarang, tidak perlu menyebutkan Dockerfile.
askb
3
Saya menemukan setelah membaca tautan Anda dengan benar bahwa DockerFile seharusnya tidak ada di folder root sama sekali. Memindahkan semuanya ke subdirektori, menjalankan perintah build dan menjalankannya. Jawaban Anda sangat membantu jadi saya akan menandainya sebagai benar.
GreenGodot
47
Periksa juga apakah ada (tidak) file Docker Ignore.
Tony
250

Periksa .dockerignorefile juga.

Saya tahu ini adalah kasus yang sangat jarang, tetapi saya memiliki file yang disebutkan di sana.

swateek
sumber
3
oh my god terima kasih. Saya mengubah nama proyek Java (dan dengan demikian artefak dan membangun dir), dan ripgreptidak mencari di dotfiles jadi saya tidak melihat referensi sial terakhir ke direktori lama.
Martin Lehmann
4
terima kasih atas pendahuluannya, dalam kasus saya, saya menggunakan wizard studio visual untuk buruh pelabuhan dan menambahkan .dockerignore dengan * di baris pertama :(
lacripta
Untuk beberapa alasan, .dockerignore default saya memiliki ** \ bin di dalamnya. Saya yakin itu dibuat oleh desktop Docker.
Steve Smith
ahhghgghghg sepertinya bukan kasus yang jarang terjadi !!!. Tidak akan menemukannya dalam sejuta tahun. Menambahkan direktori beberapa waktu lalu dan benar-benar lupa. Alasan untuk menambahkannya adalah itu membuat setiap build sangat lambat, pikir itu ada hubungannya dengan git ...
tahiche
1
oh sungguh, betapa salahnya itu. terima kasih banyak telah menunjukkan hal itu!
taiBsu
36

Mungkin karena Anda merujuk file1 / file2 / file3 sebagai jalur absolut yang tidak ada dalam konteks build, Docker hanya mencari jalur dalam konteks build.

Misalnya jika Anda menggunakan COPY / home / yourname / file1, Docker build mengartikannya sebagai $ {docker build working directory} / home / yourname / file1, jika tidak ada file dengan nama yang sama di sini, tidak ada file atau direktori yang error.

Lihat Salah satu masalah buruh pelabuhan

Popeye
sumber
ada semacam masalah jalur absolut, saya hanya bisa "SALIN relatif / jalur / x." Saya tidak bisa "COPY / absolute / path / y.", Ada yang tahu kenapa?
Alexander Mills
8
@AlexanderMills Dockerfiles seharusnya dapat dijalankan secara independen pada mesin host dan dikirimkan dengan file tambahan yang tersedia di jalur yang berhubungan dengan Dockerfile. Menggunakan jalur absolut akan membuatnya hanya dapat dijalankan di mesin Anda.
kciesielski
Itu juga masalah saya dengan ADDdirektif, terima kasih.
vmonteco
Saya tidak mengetahui ini. Mengubahnya sehingga file itu disertakan di samping dockerfile benar-benar berfungsi dengan sempurna untuk saya. Ketika saya mendapatkannya dari beberapa lokasi sumber lain (sebagai jalur lengkap misalnya / dir / dir2 / file) itu tidak berfungsi. Ini berfungsi jika ada di beberapa direktori sebagai dockerfile atau anak
Newteq Developer
22

Sepertinya perintah:

docker build -t imagename .

dan:

docker build -t imagename - < Dockerfile2

tidak dijalankan dengan cara yang sama. Jika Anda ingin membangun 2 image buruh pelabuhan dari dalam satu folder dengan Dockerfile dan Dockerfile2, perintah COPY tidak dapat digunakan pada contoh kedua menggunakan stdin (<Dockerfile2). Sebaliknya, Anda harus menggunakan:

docker build -t imagename -f Dockerfile2 .

Kemudian COPY berfungsi seperti yang diharapkan.

Tallandtree
sumber
16

Lari docker build . -f docker/development/Dockerfile berhasil, yang memungkinkan Anda untuk menjalankan file buruh pelabuhan dari direktori tertentu selain root aplikasi Anda.

Gunakan -fatau --fileuntuk menentukan nama dan lokasi fileDockerfile .

Ini terjadi pada saya ketika mencoba menjalankan file buruh pelabuhan dari direktori yang berbeda.

Saya punya COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directory dan berhasil menyelesaikan ini dengan menentukan file buruh pelabuhan.

Dulu docker build docker/development/Dockerfile yang menyebabkan masalah ini bagi saya.

Saya merasa aneh pada awalnya karena ketika saya memiliki Dockerfiledi direktori root aplikasi itu berfungsi dengan baik. Ini akan membantu jika Anda ingin mengelola file buruh pelabuhan lingkungan Anda sedikit lebih baik.

Sebuah bintang
sumber
1
docker build . -f docker/development/Dockerfileini berhasil
Pradeep Surale
1
Terima kasih banyak - ini juga berhasil untuk saya. Itu membuatku gila.
x0n
4

Saya baru saja mengalami masalah ini dan tidak ada saran di sini yang memecahkan masalah saya. Ternyata saya memiliki akhiran baris yang salah dalam file saya, dan harus mengubahnya ke akhir baris yang sesuai. (Dalam hal ini dari CRLF ke LF, jadi Ubuntu 14.04 akan mengenali skrip, yang telah saya edit di windows.)

Saya mengubah ujung baris menggunakan VSCode, dan sebagian besar editor kode harus memiliki opsi untuk memilih akhiran baris.

Semoga ini bisa membantu seseorang.

LiHRaM
sumber
Ya, itu membantu :)
Robert Smith
3

Saya merasa sedikit bodoh, tetapi masalah saya adalah bahwa saya menjalankan docker-compose, dan Dockerfile saya berada dalam subdirektori ./deploy. Referensi ADD saya harus relatif terhadap root proyek, bukan Dockerfile.

Berubah: ADD ./file.tar.gz / etc / folder / ke: ADD ./deploy/file.tar.gz / etc / folder /

Bagaimanapun, saya pikir saya akan memposting jika seseorang mengalami masalah yang sama.

fufonzo.dll
sumber
3

Inilah solusi dan praktik terbaiknya:

Anda perlu membuat folder sumber daya tempat Anda dapat menyimpan semua file yang ingin Anda salin.

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

Perintah untuk menyalin file harus ditentukan dengan cara ini:

COPY resources /root/folder/

dimana

* sumber daya - folder lokal Anda yang Anda buat di folder yang sama di mana Dockerfile berada

* / root / folder / - folder di penampung Anda

Anna van den Akker
sumber
1

Untuk kesalahan berikut,

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

Saya mengatasinya dengan memulai ulang layanan buruh pelabuhan.

sudo service docker restart
Vineeth
sumber
1

File tidak ditemukan kesalahan dengan Docker put_archive. Saya menggunakan Python API untuk buruh pelabuhan. Docker versi 1.12.5, build 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")

Saya tidak dapat menyalin file ke kontainer buruh pelabuhan yang dibuat.

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

Jika saya mengubah urutan operasi, tidak ada kesalahan dan file akan disalin persis ke tempat yang saya inginkan. Jadi saya tahu kode saya berfungsi dan melakukan apa yang saya inginkan. Namun penting untuk menyalin file konfigurasi ke penampung sebelum dimulai. Mengatasi file setelah memulai membuat penampung untuk memulai dengan konfigurasi default dan bukan konfigurasi kustom yang perlu disalin ke tempatnya sebelum penampung dimulai. Docker mengklaim bahwa masalah ini telah ditutup tetapi masih memengaruhi aplikasi saya.

Ini bekerja; Kode yang sama, urutan eksekusi berbeda.

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

Jika Anda yakin telah melakukan hal yang benar, tetapi buruh pelabuhan masih mengeluh, lihat masalah ini: https://github.com/moby/moby/issues/27134 .
Saya terbakar oleh ini, dan sepertinya memulai ulang mesin buruh pelabuhan service docker restarthanya akan memperbaiki masalah ini.

linehrr
sumber
1

Saya sedang mencari perbaikan untuk ini dan folder yang saya TAMBAH atau SALIN tidak ada di folder build, beberapa direktori di atas atau dirujuk dari /

Memindahkan folder dari luar folder build ke dalam folder build memperbaiki masalah saya.

frambos
sumber
1

salah satu cara untuk tidak menggunakan stdin dan mempertahankan konteksnya adalah:

1) di Dockerfile Anda, Anda harus menambahkan

ADD /your_dir_to_copy /location_in_container

2) setelah itu, Anda harus pergi ke induk dari / direktori_anda_to_copy dir

2) lalu jalankan perintah ini

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

3) setelah Anda membuat wadah

docker run -ti --rm cordova bash

4) Setelah Anda akan mendapatkan direktori Anda disalin di wadah Anda

Walterwhites
sumber
1

Panggilan sebelumnya di COPY mungkin mengubah direktori.

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

Tambahkan garis miring ke panggilan pertama

COPY ./server/package.json ./server/
Isaac Pak
sumber
1

Saya mengalami ini. Menyalin beberapa direktori tidak berhasil. Menyalin file berhasil. Ternyata itu karena file yang terdapat dalam .gitignore (bukan hanya .dockerignore) juga diabaikan. Lihat: https://github.com/zeit/now/issues/790

Jose Solorzano
sumber
lusinan referensi untuk COPY gagal untuk disalin - ini adalah salah satu dari sedikit referensi .dockerignoresebagai pelakunya
Alvin
1

Saya tahu ini sudah tua, tapi ada sesuatu yang perlu diperhatikan. Jika menurut Anda semuanya sudah semestinya, periksa file .gitignore Anda :)

Anda mungkin memiliki folder secara lokal, tetapi jika folder itu ada di git Anda abaikan maka itu tidak ada di server, yang berarti Docker tidak dapat menemukan folder itu karena tidak ada.

TSlegaitis
sumber
1

Serupa dan terima kasih atas jawaban tslegaitis , setelahnya

gcloud builds submit --config cloudbuild.yaml . 

itu menunjukkan

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

Memeriksa log itu, dikatakan bahwa buruh pelabuhan akan menggunakan .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

Jadi saya memperbaiki saya .gitignore(saya menggunakannya sebagai daftar putih sebagai gantinya) dan buruh pelabuhan menyalin file tersebut.

[Saya menambahkan jawaban karena reputasi saya tidak cukup untuk berkomentar]

Omr
sumber
1

Saya mengalami masalah ini meskipun direktori sumber saya dalam konteks pembuatan yang benar. Menemukan alasannya adalah bahwa direktori sumber saya adalah tautan simbolis ke lokasi di luar konteks pembuatan.

Misalnya Dockerfile saya berisi yang berikut ini:

COPY dir1 /tmp

Jika dir1merupakan tautan simbolis, COPYperintah tidak berfungsi dalam kasus saya.

algojohn
sumber
0

Jadi ini baru saja terjadi beberapa kali. Sebagai .Net dev, menggunakan VisualStudio saya mengubah nama build saya dari SomeThingmenjadiSomething sebagai nama DLL tetapi ini tidak mengubah file .csproj yang tetapSomeThing.csproj

Dockerfile menggunakan nama file case-sensitive linux, jadi Dockerfile yang baru dibuat secara otomatis mencoba menyalin Something.csproj yang tidak dapat ditemukannya. Jadi secara manual mengganti nama file itu (menjadikannya huruf kecil) membuat semuanya berfungsi

Tapi ... ini peringatan peringatan. Perubahan nama file di laptop Windows saya ini tidak diambil oleh Git sehingga sumber repo masih ada SomeThing.csprojdi repo dan selama proses CI / CD, pembuatan Docker gagal karena alasan yang sama ...

Saya harus mengubah nama file secara langsung sebagai komit pada repo .... solusi kecil yang buruk tetapi membuat saya pergi

tl; dr Jika di Windows O / S periksa sensitivitas huruf besar / kecil nama file dan perhatikan penggantian nama file lokal tidak diambil saat Git berubah jadi pastikan repo Anda juga dimodifikasi jika menggunakan CI / CD

Langit
sumber
0

Beberapa jawaban bagus sudah ada di sini. Apa yang berhasil bagi saya, adalah memindahkan komentar ke baris berikutnya.

BURUK :

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

BAIK :

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
Aleksandras Urbonas
sumber