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?
Jawaban:
Dari dokumentasi:
Ketika Anda menggunakan,
/srv/visitor
Anda menggunakan jalur absolut di luar konteks build bahkan jika itu sebenarnya direktori saat ini.Anda lebih baik mengatur konteks bangunan Anda seperti ini:
Dan gunakan:
catatan:
docker build - < Dockerfile
tidak memiliki konteks apa pun.Karena itu gunakan,
docker build .
sumber
/srv/visitor
direktori build ie .RUN cd
tetapi gunakanWORKDIR
agar 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.Bagi saya direktori itu dalam konteks yang benar, hanya saja itu dimasukkan dalam file (tersembunyi)
.dockerignore
di root proyek. Ini mengarah ke pesan kesalahan:sumber
.dockerignore
? itu baru saja terjadi pada saya!path/to/my/file
bahkan jikapath
ada di.dockerignore
.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.sumber
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.
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.
sumber
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:
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!
sumber
Bagi saya masalahnya adalah bahwa nama file yang saya tambahkan memiliki ruang tambahan. Sebuah rename memperbaikinya.
sumber
Untuk kesalahan berikut,
Saya mengatasinya dengan memulai kembali layanan buruh pelabuhan.
sumber
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.
sumber
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.Berlari
docker build . -f docker/development/Dockerfile
berhasil.Tapi menjalankan
Running
buruh pelabuhan membangun buruh pelabuhan / pengembangan / Dockerfile` menyebabkan masalah ini.-f
atau--file
untuk menentukan nama dan lokasiDockerfile
.Awalnya terasa aneh karena ketika saya memiliki
Dockerfile
di direktori root aplikasi itu bekerja dengan baik. Ini akan membantu jika Anda ingin mengelola file buruh pelabuhan lingkungan Anda sedikit lebih baik.sumber
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.sumber
Bagi saya itu adalah masalah dengan Google Cloud SDK:
https://code.google.com/p/google-cloud-sdk/issues/detail?id=1431
sumber