Masalah salin Docker - "tidak ada file atau direktori seperti itu"

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

# Copy app codeCOPY /srv/visitor /srv/visitor

Seharusnya tidak perlu dikatakan bahwa di 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 "salin" seharusnya terjadi:

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

Dikatakan bahwa tidak ada direktori seperti itu, tetapi jelas ada.

Ada ide?

Pembaruan 1:

Telah ditunjukkan kepada saya bahwa saya salah, dalam cara saya memahami konteks pembangunan. Saran tersebut sama dengan mengubah pernyataan "salin" menjadi ini:

COPY . /srv/visitor

Masalahnya adalah saya melakukannya dengan cara ini, dan proses pembuatan dihentikan pada langkah berikutnya:

RUN npm install

Dikatakan sesuatu di sepanjang baris " tidak ada paket.file json ditemukan", ketika jelas ada satu.

Pembaruan 2:

Saya mencoba menjalankannya dengan perubahan ini di Dockerfile:

COPY source /srv/visitor/

Itu berhenti ketika mencoba menjalankan npm:

Step 12 : RUN npm install ---> Running in ae5e2a993e11npm ERR! install Couldn't read dependenciesnpm ERR! Linux 3.18.5-1-ARCHnpm ERR! argv "/usr/bin/node" "/usr/sbin/npm" "install"npm ERR! node v0.10.36npm ERR! npm  v2.5.0npm ERR! path /package.jsonnpm ERR! code ENOPACKAGEJSONnpm ERR! errno 34npm 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.logINFO[0171] The command [/bin/sh -c npm install] returned a non-zero code: 34

Jadi, apakah salinannya sudah dilakukan? Jika ya, mengapa npm tidak dapat menemukan paket.json?

Bagi saya direktori itu dalam konteks yang benar, hanya saja itu termasuk dalam (tersembunyi) .dockerignore file dalam akar proyek. Ini mengarah ke pesan kesalahan:

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

Dari dokumentasi :

The <src> path harus berada di dalam konteks build; Anda tidak dapat menyalin ../something / something, karena langkah pertama dari pembuatan docker adalah mengirim direktori konteks (dan subdirektori) ke daemon docker.

Ketika Anda menggunakan /srv/visitor Anda menggunakan jalur absolut di luar konteks build meskipun sebenarnya itu adalah direktori saat ini.

Anda lebih baik mengatur konteks build Anda seperti ini :

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

Dan menggunakan :

COPY resources /srv/visitor/

Catatan:

docker build - < Dockerfile tidak memiliki konteks apapun.

Oleh karena itu gunakan,

docker build .

Bagi saya masalahnya adalah saya menggunakan docker build - < Dockerfile

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

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 adalah cuplikan dari docker-compose saya.yml:

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

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

Semoga ini bisa membantu!

Seperti yang dinyatakan oleh jawaban Xavier Lucas [sangat membantu], Anda tidak dapat menggunakan Salin atau tambahkan dari direktori di luar konteks build anda (folder tempat Anda menjalankan "docker build", harus direktori yang sama dengan Anda .Dockerfile). Bahkan jika Anda mencoba menggunakan symlink, itu tidak akan berhasil.

Catatan: ini khusus untuk POSIX (Linux, Unix, Mac, mungkin 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 docker Anda khusus untuk host. Anda hampir tidak pernah ingin melakukan ini! Tangani dengan hati-hati.

Aplikasi: belajar, bereksperimen dalam lingkungan pengembangan

Ini melakukan trik untuk saya. cp-Al menyalin struktur direktori dan membuat tautan keras untuk semua file. Ketika Anda selesai menjalankan " rm-rf ./ src_directory " untuk menghapusnya.

Untuk kesalahan berikut,

COPY failed: stat

Saya mendapatkannya dengan memulai ulang layanan docker.

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

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

Berlari docker build . -f docker/development/Dockerfile bekerja.

Tapi berlari Runningdocker build docker / development / Dockerfile` menyebabkan masalah ini.

-f atau --file untuk menentukan nama dan lokasi Dockerfile.

Ini ditemukan aneh pada awalnya karena ketika saya memiliki Dockerfile di direktori root aplikasi itu berfungsi dengan baik. Ini akan membantu jika Anda ingin mengelola file docker lingkungan Anda sedikit lebih baik.

Bagi siapa saja yang tertarik, .gitignore juga dapat menyebabkan masalah. Dalam kasus saya, benang.kunci diabaikan. Dan itu melemparkan kesalahan yang sama.

Bagi saya masalahnya adalah nama file yang saya tambahkan memiliki spasi tambahan. Sebuah mengubah nama tetap itu.

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

Bagi mereka yang mencari masalah pada tahun 2017-ini mungkin masalah Anda /var/lib/docker/tmp/docker-builderXXXXXXX/... no such file or directory · Issue #1922 · docker/for-mac · GitHub. ini merekomendasikan untuk menghapus Anda .dockerignore file dan pengujian ulang. Jika itu berhasil, anda dapat mengutak-atik pengaturan Anda .dockerignore untuk menyelesaikan masalah.