ปัญหา Docker COPY -“ ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว”


36

ใน Dockerfile ของฉันฉันมีคำสั่ง 'คัดลอก "ต่อไปนี้:

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

มันควรจะไปโดยไม่บอกว่าในระบบโฮสต์ของฉันภายใต้ไดเรกทอรี "/ srv / ผู้เยี่ยมชม" มีรหัสแหล่งที่มาของฉัน:

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

ตอนนี้เมื่อฉันพยายามสร้างภาพโดยใช้ Dockerfile นี้มันค้างในขั้นตอนที่ควรจะเกิด "COPY":

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

มันบอกว่าไม่มีไดเรกทอรีดังกล่าว แต่มีอย่างชัดเจน

ความคิดใด ๆ

อัปเดต 1:

มันชี้ให้เห็นว่าฉันเข้าใจผิดว่าฉันเข้าใจบริบทของการสร้าง ข้อเสนอแนะมีจำนวนการเปลี่ยนคำสั่ง "COPY" เป็น:

COPY . /srv/visitor

ปัญหาคือว่าฉันมีวิธีนี้และกระบวนการสร้างหยุดในขั้นตอนถัดไปมาก:

RUN npm install

มันพูดอะไรบางอย่างในบรรทัดของ "ไม่พบไฟล์ package.json" เมื่อมีอย่างชัดเจน

อัปเดต 2:

ฉันพยายามเรียกใช้ด้วยการเปลี่ยนแปลงนี้ใน Dockerfile:

COPY source /srv/visitor/

มันหยุดทำงานเมื่อพยายามเรียกใช้ 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

ดังนั้นมีการทำสำเนาหรือไม่ ถ้าใช่ทำไมไม่สามารถค้นหา package.json ได้


สำหรับผู้ที่มองหาปัญหาในปี 2017 - นี่อาจจะเป็นปัญหาของคุณได้github.com/docker/for-mac/issues/1922 แนะนำให้คุณลบไฟล์ .ockerignore และทดสอบซ้ำ หากใช้งานได้คุณสามารถเล่นซอกับการตั้งค่าของคุณใน. docerignore เพื่อแก้ไขปัญหา
ไม่ได้กำหนด

คำตอบ:


35

จากเอกสาร:

<src>เส้นทางจะต้องอยู่ภายในบริบทของการสร้างที่ ; คุณไม่สามารถคัดลอก .. / บางสิ่ง / บางสิ่งบางอย่างได้เนื่องจากขั้นตอนแรกของการสร้างนักเทียบท่าคือการส่งไดเรกทอรีบริบท (และไดเรกทอรีย่อย) ไปยังนักเทียบท่า daemon

เมื่อคุณใช้/srv/visitorคุณใช้พา ธ สัมบูรณ์นอกบริบทการสร้างแม้ว่าจริงๆแล้วมันจะเป็นไดเรกทอรีปัจจุบัน

คุณจัดระเบียบบริบทการสร้างของคุณดีขึ้นเช่นนี้:

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

และใช้:

COPY resources /srv/visitor/

บันทึก:

docker build - < Dockerfile ไม่มีบริบทใด ๆ

ดังนั้นการใช้

docker build .


ฉันอยู่ในไดเรกทอรี "/ srv / visitor" ของระบบโฮสต์ของฉันแล้วและซอร์สโค้ดทั้งหมดของฉันรวมถึง Dockerfile อยู่ที่นี่ด้วย ฉันควรเขียนคำสั่ง "COPY" ของฉันอย่างไรเพื่อให้แหล่งที่มานี้ทั้งหมดถูกคัดลอกภายในไดเรกทอรี "/ srv / ผู้เยี่ยมชม" ของคอนเทนเนอร์
dsljanus

1
@dsljanus ไดเรกทอรีแหล่งที่มาหรือไฟล์จะต้องเกี่ยวข้องกับการสร้างบริบทเช่น/srv/visitorไดเรกทอรี
ซาเวียร์ลูคัส

ดังนั้นควรเป็น "." เนื่องจากฉันมีวิธีการดังกล่าวและกระบวนการสร้างหยุดทำงานในขั้นตอนถัดไป "ติดตั้ง RUN npm" มันพูดอะไรบางอย่างในบรรทัดของ "ไม่พบไฟล์ package.json" โปรดดูการอัปเดตของฉันด้วย
dsljanus

2
@dsljanus แล้วคุณจะเรียกใช้ npm จากที่ไหน โพสต์ไฟล์ dockerfile ทั้งหมดของคุณ ... Btw ไม่ได้แก้ไขการอัปเดตหลาย ๆ อย่างในคำถามนี้มันน่ารำคาญจริงๆที่จะข้ามจากปัญหาหนึ่งไปยังอีกปัญหาหนึ่ง วัตถุประสงค์ของ SF คือการโพสต์คำถามที่ชัดเจนเพื่อให้ได้คำตอบที่ชัดเจน
Xavier Lucas

1
@dsljanus ตกลงดังนั้นเป็นปัญหาอย่าใช้RUN cdแต่ใช้WORKDIRเพื่อให้ไดเรกทอรีปัจจุบันถูกจดจำระหว่างแต่ละขั้นตอน dockerfile ไม่มากไปกว่า wrapper สำหรับการเรียกใช้นักเทียบท่า + นักเทียบท่ายอมรับดังนั้นแต่ละขั้นตอนจะถูกเรียกใช้อย่างอิสระเหนือเลเยอร์ก่อนหน้า ซึ่งหมายความว่า pwd เท่ากับ/ในแต่ละขั้นตอนถ้าคุณไม่ใช้คำสั่งนี้
Xavier Lucas

39

สำหรับฉันไดเรกทอรีอยู่ในบริบทที่ถูกต้องเฉพาะมันเท่านั้นที่รวมอยู่ในไฟล์ (ซ่อน) .dockerignoreในรากของโครงการ สิ่งนี้นำไปสู่ข้อความแสดงข้อผิดพลาด:

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

3
คุณหมายถึง.dockerignoreอะไร ที่เพิ่งเกิดขึ้นกับฉัน
Martín Coll

5
อวยพรคุณ! มีไดเรกทอรีทั้งหมดที่ฉันไม่สนใจว่าฉันลืมและมันทำลายงานสร้างของฉัน ในฐานะที่เป็นโน้ตเล็ก ๆ คุณสามารถยกเลิกการละเว้นไฟล์เดียวในไดเรกทอรีกับ: !path/to/my/fileแม้ว่าอยู่ในpath .dockerignore
hjc1710

นี่เป็นสิ่งที่ดี
Gudlaugur Egilsson

ไม่สามารถบอกได้ว่าฉันรู้สึกขอบคุณคุณมากแค่ไหนในเรื่องนี้ทรมานตัวเองมาตลอดทั้งวัน ยังไม่สามารถเข้าใจได้ว่าทำไม VS Tools for docker จึงรวม. dockerignore พร้อม * ไว้ด้วย
bilal.haider

7

สำหรับฉันปัญหาคือว่าฉันกำลังใช้ docker build - < Dockerfile

จากเอกสารประกอบ หมายเหตุ: หากคุณสร้างโดยใช้ STDIN ( docker build - < somefile) จะไม่มีบริบทการสร้างดังนั้นจึงไม่สามารถใช้ COPY ได้


1

เนื่องจากคำตอบของ Xavier Lucas มีประโยชน์อย่างมากคุณไม่สามารถใช้ COPY หรือ ADD จากไดเรกทอรีที่อยู่นอกบริบทการสร้างของคุณ (โฟลเดอร์ที่คุณเรียกใช้ "docker build" ควรเป็นไดเรกทอรีเดียวกับ. Dockerfile ของคุณ) แม้ว่าคุณจะพยายามใช้ symlink มันจะไม่ทำงาน

หมายเหตุ: นี่เป็นเฉพาะสำหรับ POSIX (Linux, Unix, Mac, อาจเป็นระบบย่อย Linux สำหรับ Windows) คุณอาจทำสิ่งที่คล้ายกันใน Windows โดยใช้ JUNCTION

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

อันตราย: การใช้สิ่งนี้จะทำให้โครงการนักเทียบท่าของคุณเฉพาะกับโฮสต์ คุณแทบไม่ต้องการทำสิ่งนี้! จัดการด้วยความระมัดระวัง.

แอพลิเคชัน: การเรียนรู้การทดลองในสภาพแวดล้อมการพัฒนา

นี้ได้เคล็ดลับสำหรับฉัน. cp -al คัดลอกโครงสร้างไดเร็กทอรีและสร้างฮาร์ดลิงก์สำหรับไฟล์ทั้งหมด เมื่อคุณเรียกใช้ "rm -rf ./src_directory" เสร็จแล้วให้ลบออก


จุดประสงค์ของฉัน: คัดลอกแพ็กเกจแคชบนระบบไฟล์โลคัลของฉันไปยังอิมเมจ Docker ของฉัน ติดตั้งเครื่องมือที่ฉันต้องการ (มันจะใช้แคชหรือดาวน์โหลดใหม่) จากนั้นฉันจะลบแคชนั้นในรูปภาพและลบฮาร์ดลิงก์ในโฮสต์ หากโฮสต์ไม่มีไฟล์เหล่านั้นไม่ต้องกังวล แต่ฉันมีแบนด์วิดท์ จำกัด และพื้นที่ไดรฟ์ จำกัด นี่เป็นการใช้ที่ยอมรับได้หรือไม่?
TamusJRoyce

1

ฉันพบปัญหานี้และพบว่าฉันสามารถเพิ่มบริบทลงในตัวแปรบิลด์เพื่อโหลดไฟล์ Dockerfile จากไดเรกทอรีอื่น สิ่งนี้ทำให้ฉันเปลี่ยนโครงสร้างไฟล์ Docker เริ่มต้นของฉันได้มากขึ้นตามความชอบของฉัน นี่คือตัวอย่างจากนักเทียบท่าของฉัน-compose.yml:

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

โดยการเพิ่มบริบทฉันสามารถกำหนดที่ไฟล์ควรจะอ้างอิง คุณสามารถอ้างอิงเอกสารนักเทียบท่าได้ที่นี่: https://docs.docker.com/compose/compose-file/#context

หวังว่านี่จะช่วยได้!


0

สำหรับฉันปัญหาคือชื่อไฟล์ที่ฉันเพิ่มมีพื้นที่ต่อท้าย การเปลี่ยนชื่อแก้ไขมัน


0

สำหรับข้อผิดพลาดดังต่อไปนี้

COPY failed: stat

ฉันได้รับมันโดยการรีสตาร์ทบริการนักเทียบท่า


0

ในที่สุดฉันก็แก้ไขปัญหานี้ในกรณีของฉันคือ Dockerfile ที่เรียกใช้งานการคัดลอกอยู่ในระดับที่ลึกกว่าของโครงการ ดังนั้นฉันจึงรู้ว่าเส้นทางการสร้างของโฮสต์นั้นสัมพันธ์กับตำแหน่งไฟล์ของ Dockerfile


0

เรื่องนี้เกิดขึ้นกับฉันเมื่อพยายามเรียกใช้ไฟล์นักเทียบท่าจากไดเรกทอรีอื่น

ฉันมีCOPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directoryและจัดการเพื่อแก้ไขปัญหานี้โดยการระบุไฟล์นักเทียบท่า

ทำงานdocker build . -f docker/development/Dockerfileทำงาน

แต่การทำงานRunningนักเทียบท่าสร้างนักเทียบท่า / การพัฒนา / Dockerfile` ทำให้เกิดปัญหานี้

-fหรือการระบุชื่อและที่ตั้งของ--fileDockerfile

พบว่ามันแปลกในตอนแรกเพราะเมื่อฉันมีDockerfileในไดเรกทอรีรากของแอปมันทำงานได้ดี สิ่งนี้จะช่วยได้ถ้าคุณต้องการจัดการไฟล์ docker ของสภาพแวดล้อมดีขึ้นเล็กน้อย


0

ไม่เพียง แต่ไฟล์จะต้องอยู่ในไดเรกทอรีในบริบทบิลด์ปัจจุบัน แต่ไฟล์นั้นไม่สามารถเป็นซอฟต์ลิงก์ไปยังไฟล์ที่อยู่นอกบริบทบิลด์ได้

ฉันมีลิงค์ไปยังไฟล์ในไดเรกทอรีบ้านของฉันและลิงค์นั้นอยู่ในไดเรกทอรีโครงการ หลังจากฉันลบลิงค์และย้ายไฟล์ที่เชื่อมโยงไปยังโปรเจ็กต์ ( rm mylink ; mv ~/myrealfile ./) มันทำงานได้


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.