นักเทียบท่า: การเพิ่มไฟล์จากไดเรกทอรีหลัก


186

ในฉันDockerfileฉันได้รับ:

ADD ../../myapp.war /opt/tomcat7/webapps/

ไฟล์นั้นมีอยู่เพราะls ../../myapp.warส่งคืนไฟล์ที่ถูกต้องให้ฉัน แต่เมื่อฉันดำเนินการsudo docker build -t myapp .ฉันได้รับ:

Step 1 : ADD ../../myapp.war /opt/tomcat7/webapps/
2014/07/02 19:18:09 ../../myapp.war: no such file or directory

มีใครรู้บ้างว่าทำไมและทำอย่างถูกต้อง


2
การแก้ไขปัญหาบางอย่างsuperuser.com/questions/842642
GünterZöchbauer

คำตอบ:


225

คุณสามารถสร้าง Dockerfile ได้จากไดเรกทอรีหลัก:

docker build -t <some tag> -f <dir/dir/Dockerfile> .

3
ขอบคุณ! วิธีนี้ใช้งานได้ดีบนกล่องภายในเครื่อง แต่ Docker Hub ไม่สามารถสร้างภาพได้เนื่องจากพยายามทำจากไดเรกทอรีเดียวกัน (tbh ตามที่คาดไว้) มีวิธีใดที่จะทำแบบเดียวกันกับ Docker Hub หรือไม่?
Marcel Hernandez

ไม่ใช่ที่ฉันรู้ คุณสามารถผลักภาพไปยังรีจิสทรีแทนการใช้การสร้างอัตโนมัติ
Boedy

2
@ eduncan911 ฉันไม่คิดว่าจะเลิกในเวลาที่ฉันเขียนความคิดเห็นของฉัน พวกเขาอาจเปลี่ยนใจตั้งแต่นั้นมา? หากฉันผิดคุณสามารถลิงค์ไปยังเอกสารที่มีข้อความระบุว่ามันเลิกใช้แล้วได้หรือไม่ ขอบคุณ!
omninonsense

6
-f ไม่ปรากฏที่จะเลิกต่อเอกสาร -> ระบุ Dockerfile (-f) : docs.docker.com/engine/reference/commandline/build/...
เรย์

6
@ eduncan911 คุณสามารถลบความคิดเห็นของคุณเพราะเห็นได้ชัดว่าไม่ได้คัดค้านหรือไม่? ฉันข้ามคำตอบนี้ในตอนแรกเพราะความคิดเห็นของคุณ
Chris Anderson

103

แต่น่าเสียดายที่ (ด้วยเหตุผลในทางปฏิบัติและการรักษาความปลอดภัยผมคิดว่า) ถ้าคุณต้องการที่จะเพิ่ม / Dockerfileคัดลอกเนื้อหาในท้องถิ่นก็จะต้องอยู่ภายใต้เส้นทางรากเดียวกันกว่า

จากเอกสาร :

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

แก้ไข:ตอนนี้มีตัวเลือก ( -f) เพื่อกำหนดเส้นทางของ Dockerfile ของคุณ; มันสามารถใช้เพื่อให้บรรลุสิ่งที่คุณต้องการดูการตอบสนองของ @Boedy nelow


22
มีวิธีแก้ปัญหา "สะอาด" สำหรับสิ่งนี้หรือไม่ ฉันไม่ต้องการปรับโครงสร้างไดเรกทอรีโครงการทั้งหมดของฉันเพื่อรองรับสิ่งนี้
ben_frankly

ตามที่กล่าวโดย@Günterมีวิธีแก้ปัญหาที่นี่superuser.com/a/842690/136024 ... มัน "สะอาด" จริงหรือ อย่างน้อยก็เป็น "วิธีแก้ปัญหา" :)
แอนโธนีโอ

2
ดูคำตอบที่ดีขึ้นจาก @Boedy stackoverflow.com/a/34300129/2950621
nmgeek

103

ด้วยนักเทียบท่าเขียนคุณสามารถตั้งค่าโฟลเดอร์บริบท:

#docker-compose.yml
version: '3.3'    
services:
      yourservice:
        build:
          context: ./
          dockerfile: ./docker/yourservice/Dockerfile

9

การเพิ่มโค้ดบางส่วนเพื่อรองรับคำตอบที่ยอมรับ

โครงสร้างไดเรกทอรี:

setup/
 |__docker/DockerFile
 |__target/scripts/<myscripts.sh>
src/
 |__<my source files>

รายการไฟล์นักเทียบท่า:

RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/scripts/
RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/src/
WORKDIR /home/vagrant/dockerws/chatServerInstaller

#Copy all the required files from host's file system to the container file system.
COPY setup/target/scripts/install_x.sh scripts/
COPY setup/target/scripts/install_y.sh scripts/
COPY src/ src/

คำสั่งที่ใช้ในการสร้างภาพนักเทียบท่า

docker build -t test:latest -f setup/docker/Dockerfile .

วิธีการที่ดี เป็นไปได้ไหมที่จะแบ่งปันรหัสinstall_x.shด้วย?
Ariful Haque

4

วิธีแก้ปัญหาสำหรับผู้ที่ใช้ผู้แต่งคือการใช้วอลลุ่มที่ชี้ไปยังโฟลเดอร์พาเรนต์:

#docker-composer.yml

foo:
  build: foo
  volumes:
    - ./:/src/:ro

แต่ฉันค่อนข้างมั่นใจว่าสามารถเล่นกับโวลุ่มใน Dockerfileได้


3
มันไม่สามารถ หมายเหตุ: ไดเรกทอรีโฮสต์นั้นขึ้นอยู่กับโฮสต์ ด้วยเหตุผลนี้คุณไม่สามารถเมานต์โฮสต์ไดเรกทอรีจาก Dockerfile ได้เนื่องจากรูปภาพที่สร้างขึ้นควรเป็นแบบพกพา ไดเรกทอรีโฮสต์จะไม่สามารถใช้ได้กับโฮสต์ที่มีศักยภาพทั้งหมด docs.docker.com/engine/tutorials/dockervolumes/ …
Peeter Kokk

4

ตั้งแต่-fเกิดปัญหาอื่นฉันพัฒนาวิธีแก้ปัญหาอื่น

  • สร้างอิมเมจพื้นฐานในโฟลเดอร์พาเรนต์
  • เพิ่มไฟล์ที่จำเป็น
  • ใช้ภาพนี้เป็นภาพฐานสำหรับโครงการที่อยู่ในโฟลเดอร์ที่สืบทอด

การ-fตั้งค่าสถานะไม่สามารถแก้ไขปัญหาของฉันได้เนื่องจากonbuildรูปภาพของฉันค้นหาไฟล์ในโฟลเดอร์และต้องเรียกเช่นนี้:

-f foo/bar/Dockerfile foo/bar

แทน

-f foo/bar/Dockerfile .

โปรดทราบว่านี่เป็นวิธีแก้ปัญหาเฉพาะบางกรณีในฐานะ-fแฟล็ก

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