Masalah Docker COPY - “tidak ada file atau direktori”

38

Di Dockerfile saya, saya memiliki pernyataan 'COPY "berikut:

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

Seharusnya tanpa mengatakan bahwa dalam sistem host saya, di bawah direktori "/ srv / visitor", memang ada kode sumber saya:

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

Sekarang, ketika saya mencoba membuat gambar menggunakan Dockerfile ini hang pada langkah ketika "COPY" seharusnya terjadi:

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

Ia mengatakan bahwa tidak ada direktori seperti itu, tetapi jelas ada.

Ada ide?

PEMBARUAN 1:

Telah ditunjukkan kepada saya bahwa saya salah, dalam cara saya memahami membangun konteks. Sarannya sama dengan mengubah pernyataan "COPY" menjadi ini:

COPY . /srv/visitor

Masalahnya adalah saya melakukannya dengan cara ini, dan proses pembangunan terhenti pada langkah berikutnya:

RUN npm install

Itu mengatakan sesuatu di sepanjang baris "tidak ada file package.json ditemukan", ketika jelas ada satu.

PEMBARUAN 2:

Saya mencoba menjalankannya dengan perubahan ini di Dockerfile:

COPY source /srv/visitor/

Itu terhenti ketika mencoba menjalankan npm:

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

Jadi, sudahkah salinannya dilakukan? Jika ya, mengapa npm tidak dapat menemukan package.json?

dsljanus
sumber
Bagi mereka yang mencari masalah di 2017 - ini mungkin masalah Anda github.com/docker/for-mac/issues/1922 . itu merekomendasikan menghapus file .dockerignore Anda dan pengujian ulang. Jika berhasil, Anda dapat mengutak-atik pengaturan Anda di .dockerignore untuk menyelesaikan masalah.
ditentukan

Jawaban:

36

Dari dokumentasi:

The <src>path harus berada di dalam konteks membangun ; Anda tidak dapat COPY ../something / sesuatu, karena langkah pertama pembuatan buruh pelabuhan adalah mengirim direktori konteks (dan subdirektori) ke daemon buruh pelabuhan.

Ketika Anda menggunakan, /srv/visitorAnda menggunakan jalur absolut di luar konteks build bahkan jika itu sebenarnya direktori saat ini.

Anda lebih baik mengatur konteks bangunan Anda seperti ini:

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

Dan gunakan:

COPY resources /srv/visitor/

catatan:

docker build - < Dockerfile tidak memiliki konteks apa pun.

Karena itu gunakan,

docker build .

Xavier Lucas
sumber
Saya sudah berada di dalam direktori "/ srv / visitor" dari sistem host saya, dan semua kode sumber saya, plus Dockerfile, ada di sini. Bagaimana saya harus menulis pernyataan "COPY" saya sehingga semua sumber ini dapat disalin di dalam direktori "/ srv / visitor" di dalamnya?
dsljanus
1
@dsljanus Direktori sumber atau file harus relatif terhadap /srv/visitordirektori build ie .
Xavier Lucas
Jadi, haruskah itu "."? Karena saya sudah seperti itu, dan proses pembangunan terhenti pada langkah berikutnya, "RUN npm install". Itu mengatakan sesuatu di sepanjang baris "tidak ada file package.json ditemukan". Silakan lihat pembaruan saya juga.
dsljanus
2
@dsljanus Jadi dari mana Anda menjalankan npm? Posting seluruh berkas galangan Anda ... Btw jangan mengubah beberapa pembaruan seperti ini di pertanyaan, itu benar-benar menjengkelkan untuk beralih dari satu masalah ke masalah yang sama sekali berbeda. Tujuan SF adalah untuk mengirim pertanyaan yang jelas untuk mendapatkan jawaban yang jelas.
Xavier Lucas
1
@dsljanus Ok jadi itu masalahnya, jangan gunakan RUN cdtetapi gunakan WORKDIRagar direktori saat ini diingat antara setiap langkah. Dockerfile tidak lebih dari pembungkus untuk docker run + docker commit sehingga setiap langkah dijalankan secara independen di atas lapisan sebelumnya. Ini berarti pwd sama dengan /di setiap langkah jika Anda tidak menggunakan arahan ini.
Xavier Lucas
41

Bagi saya direktori itu dalam konteks yang benar, hanya saja itu dimasukkan dalam file (tersembunyi) .dockerignoredi root proyek. Ini mengarah ke pesan kesalahan:

lstat mydir/myfile.ext: no such file or directory
AlcaDot
sumber
3
Anda berarti .dockerignore? itu baru saja terjadi pada saya
Martín Coll
5
Diberkatilah Anda! Punya seluruh direktori yang saya abaikan sehingga saya lupa dan itu membuat saya rusak. Sebagai catatan kecil, Anda dapat membatalkan abaikan satu file dalam direktori dengan: !path/to/my/filebahkan jika pathada di .dockerignore.
hjc1710
Ini bagus.
Gudlaugur Egilsson
Tidak bisa mengungkapkan betapa bersyukurnya saya kepada Anda untuk ini, telah menyiksa diri selama seharian. Masih tidak mengerti mengapa VS Tools untuk buruh pelabuhan menyertakan .dockerignore dengan * di dalamnya
bilal.haider
Tidak dapat memilih cukup banyak!
kmansoor
7

Bagi saya masalahnya adalah yang saya gunakan docker build - < Dockerfile

Dari dokumentasi Catatan: Jika Anda membangun menggunakan STDIN ( docker build - < somefile), tidak ada konteks bangunan, jadi COPY tidak dapat digunakan.

Adam
sumber
1

Seperti yang dinyatakan Xavier Lucas [sangat membantu], Anda tidak dapat menggunakan COPY atau ADD dari direktori di luar konteks build Anda (folder tempat Anda menjalankan "docker build", seharusnya direktori yang sama dengan .Dockerfile Anda). Bahkan jika Anda mencoba menggunakan symlink, itu tidak akan berfungsi.

Catatan: Ini khusus untuk POSIX (Linux, Unix, Mac, Kemungkinan Subsistem Linux untuk Windows). Anda mungkin dapat melakukan hal serupa di Windows menggunakan JUNCTION.

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

Bahaya: Menggunakan ini akan membuat proyek buruh pelabuhan Anda khusus untuk tuan rumah. Anda hampir tidak pernah mau melakukan ini! Tangani dengan hati-hati.

Aplikasi: Belajar, Bereksperimen dalam Lingkungan Pengembangan

Ini berhasil bagi saya. cp -al menyalin struktur direktori dan membuat tautan keras untuk semua file. Setelah selesai jalankan "rm -rf ./src_directory" untuk menghapusnya.

TamusJRoyce
sumber
Tujuan saya: Menyalin paket dalam cache pada sistem file lokal saya ke gambar buruh pelabuhan saya. Instal alat yang saya butuhkan (itu akan menggunakan cache atau mengunduhnya baru). Lalu saya menghapus cache itu di dalam gambar dan menghapus hard-link pada host. Jika tuan rumah tidak memiliki file-file itu, jangan khawatir. Tetapi saya memiliki bandwidth terbatas dan ruang drive terbatas. Apakah ini penggunaan yang dapat diterima?
TamusJRoyce
1

Saya mengalami masalah ini dan menemukan bahwa saya dapat menambahkan konteks ke variabel build untuk memuat Dockerfile saya dari direktori lain. Ini memungkinkan saya untuk mengubah struktur file Docker default saya sedikit lebih sesuai dengan keinginan saya. Berikut ini cuplikan dari docker-compose.yml saya:

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

Dengan menambahkan konteks, saya dapat menentukan di mana file harus dirujuk. Anda dapat merujuk dokumen Docker di sini: https://docs.docker.com/compose/compose-file/#context

Semoga ini membantu!

Ron
sumber
0

Bagi saya masalahnya adalah bahwa nama file yang saya tambahkan memiliki ruang tambahan. Sebuah rename memperbaikinya.

Hawkeye
sumber
0

Untuk kesalahan berikut,

COPY failed: stat

Saya mengatasinya dengan memulai kembali layanan buruh pelabuhan.

Vineeth
sumber
0

Saya akhirnya memecahkan masalah ini dalam kasus saya adalah Dockerfile yang mengeksekusi salinan berada di tingkat proyek yang lebih dalam. Jadi saya menyadari bahwa path build host diekspresikan relatif terhadap lokasi file Dockerfile.

EmilianoPe
sumber
0

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 directorydan berhasil menyelesaikan ini dengan menentukan file buruh pelabuhan.

Berlari docker build . -f docker/development/Dockerfileberhasil.

Tapi menjalankan Runningburuh pelabuhan membangun buruh pelabuhan / pengembangan / Dockerfile` menyebabkan masalah ini.

-fatau --fileuntuk menentukan nama dan lokasi Dockerfile.

Awalnya terasa aneh karena ketika saya memiliki Dockerfiledi direktori root aplikasi itu bekerja dengan baik. Ini akan membantu jika Anda ingin mengelola file buruh pelabuhan lingkungan Anda sedikit lebih baik.

Sebuah bintang
sumber
0

File tidak hanya harus berada di direktori dalam konteks build saat ini, tetapi file tersebut juga tidak boleh menjadi tautan lunak ke file di luar konteks build.

Saya memiliki tautan ke file di direktori home saya, dan tautan itu ada di direktori proyek. Setelah saya menghapus tautan dan memindahkan file yang ditautkan ke proyek ( rm mylink ; mv ~/myrealfile ./), kemudian berhasil.

Loduwijk
sumber