قضية نسخ عامل الميناء - "لا يوجد مثل هذا الملف أو الدليل"

في بلدي دوكيرفيل لدي بيان "نسخة" التالية:

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

يجب أن يذهب دون أن يقول أنه في نظام المضيف الخاص بي ، تحت دليل "/ سرف / الزوار" ، هناك بالفعل شفرة المصدر الخاصة بي:

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

الآن ، عندما أحاول بناء صورة باستخدام هذا دوكيرفيل فإنه يعلق في الخطوة عندما" نسخة " من المفترض أن يحدث:

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

تقول أنه لا يوجد مثل هذا الدليل ، ولكن هناك بوضوح.

أي أفكار?

تحديث 1:

وقد أشير لي أنني كنت مخطئا ، في الطريقة التي فهمت بناء السياق. كان الاقتراح بمثابة تغيير عبارة" نسخة " إلى هذا:

COPY . /srv/visitor

المشكلة هي أنني حصلت عليها بهذه الطريقة ، وتوقفت عملية البناء في الخطوة التالية:

RUN npm install

وقال شيئا على غرار " لا حزمة.العثور على ملف جسون " ، عندما يكون هناك بوضوح واحد.

تحديث 2:

حاولت تشغيله مع هذا التغيير في دوكيرفيل:

COPY source /srv/visitor/

توقفت عند محاولة تشغيل الآلية الوقائية الوطنية:

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

وبالتالي, وقد تم تنفيذ نسخة? إذا كانت الإجابة بنعم ، لماذا الآلية الوقائية الوطنية غير قادر على العثور على الحزمة.جسون?

بالنسبة لي كان الدليل في السياق الصحيح، فقط تم تضمينه في (مخفي) .dockerignore ملف في جذر المشروع. يؤدي هذا إلى رسالة الخطأ:

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

من الوثائق :

ال <src> المسار يجب أن يكون داخل سياق البناء؛ لا يمكنك نسخ ../ شيء / شيء ، لأن الخطوة الأولى من بناء عامل الميناء هو إرسال دليل السياق (والدلائل الفرعية) إلى الخفي عامل الميناء.

عند استخدام /srv/visitor أنت تستخدم مسارا مطلقا خارج سياق الإنشاء حتى لو كان الدليل الحالي بالفعل.

من الأفضل تنظيم سياق البناء الخاص بك مثل هذا :

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

واستخدام :

COPY resources /srv/visitor/

ملاحظة:

docker build - < Dockerfile ليس لديها أي سياق.

ومن ثم استخدام,

docker build .

بالنسبة لي كانت المشكلة أنني كنت أستخدم docker build - < Dockerfile

من ال الوثائقملاحظة: إذا كنت بناء باستخدام ستدين (docker build - < somefile) ، لا يوجد سياق بناء، لذلك لا يمكن استخدام النسخ.

كنت أواجه هذه المشكلة ووجدت أنني تمكنت من إضافة سياق إلى متغير البناء من أجل تحميل ملف(ملفات) دوكيرفيل من الدلائل الأخرى. هذا سمح لي بتغيير بنية ملف عامل الميناء الافتراضي الخاص بي أكثر قليلا حسب رغبتي. هنا مقتطف من بلدي عامل الميناء يؤلف.يمل:

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

بإضافة السياق ، تمكنت من تحديد مكان الإشارة إلى الملفات. يمكنك الرجوع إلى مستندات عامل الميناء هنا: https://docs.docker.com/compose/compose-file/#context

آمل أن يساعد هذا!

كما ذكر كزافييه لوكاس [مفيدة للغاية] الجواب ، لا يمكنك استخدام نسخ أو إضافة من دليل خارج سياق البناء الخاص بك (المجلد الذي تقوم بتشغيل "بناء عامل الميناء" من ، يجب أن يكون نفس الدليل الخاص بك .دوكيرفيل). حتى إذا حاولت استخدام ارتباط رمزي، فلن يعمل.

ملاحظة: هذا هو محدد ل بوسيكس (لينكس ، يونكس ، ماك ، وربما لينكس النظام الفرعي ويندوز). قد تكون قادرة على القيام مماثلة في ويندوز باستخدام تقاطع.

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

خطر: استخدام هذا سيجعل مشروع عامل الميناء الخاص بك محددة للمضيف. أنت تقريبا لا تريد أن تفعل هذا! التعامل مع الرعاية.

التطبيق: التعلم والتجريب في بيئة التطوير

هذا لم خدعة بالنسبة لي. كب - آل نسخ بنية الدليل ويجعل الروابط الصلبة لجميع الملفات. عند الانتهاء من تشغيل " جمهورية مقدونيا-الترددات اللاسلكية ./ صرك_دليل " لإزالته.

للخطأ التالي,

COPY failed: stat

حصلت عليه من خلال إعادة تشغيل خدمة عامل الميناء.

حدث هذا لي عند محاولة تشغيل ملف عامل الميناء من دليل مختلف.

كان لي COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directory وتمكنت من حل هذا عن طريق تحديد ملف عامل الميناء.

تشغيل docker build . -f docker/development/Dockerfile عملت.

لكن الجري Runningعامل الميناء بناء عامل الميناء / التنمية` دوكيرفيل ' تسبب هذه المشكلة.

-f أو --file لتحديد اسم وموقع Dockerfile.

وجدت أنه من الغريب في البداية لأنه عندما كان لي Dockerfile في الدليل الجذر تطبيقات عملت بشكل جيد. وهذا سوف يساعد إذا كنت ترغب في إدارة الملفات عامل الميناء البيئة الخاصة بك أفضل قليلا.

لمن يهمه الأمر, .جيتينور يمكن أيضا أن يسبب المشكلة. في حالتي ، الغزل.تم تجاهل القفل. وألقى خطأ مماثل.

بالنسبة لي ، كانت المشكلة هي أن اسم الملف الذي كنت أضفه يحتوي على مساحة زائدة. إعادة تسمية إصلاحه.

وأخيرا حل هذه المشكلة في حالتي كان دوكيرفيل الذي ينفذ نسخة كان في مستوى أعمق من project.So أدركت أن مسار بناء المضيف يتم التعبير عنه بالنسبة لموقع ملف دوكيرفيل.

لأولئك الذين يبحثون عن مشكلة في عام 2017-قد تكون هذه مشكلتك /var/lib/docker/tmp/docker-builderXXXXXXX/... no such file or directory · Issue #1922 · docker/for-mac · GitHub. توصي بحذفك .دوكيرينور ملف وإعادة الاختبار. إذا كان هذا يعمل يمكنك عزف مع الإعدادات الخاصة بك في .دوكيرينور لحل المشكلة.