นักเทียบท่าทำตาม symlink นอกบริบท


93

ยังมีอีกคำถาม symlink ของ Docker ฉันมีไฟล์มากมายที่ต้องการคัดลอกไปยัง Docker builds ทั้งหมดของฉัน โครงสร้าง dir ของฉันคือ:

parent_dir
    - common_files
        - file.txt
    - dir1
        - Dockerfile  
        - symlink -> ../common_files

ในตัวอย่างข้างต้นฉันต้องการให้คัดลอก file.txt เมื่อฉันสร้างนักเทียบท่าภายใน dir1 แต่ฉันไม่ต้องการคงสำเนา file.txt ไว้หลายชุด ตามลิงค์นี้สำหรับนักเทียบท่ารุ่น 0.10ต้องสร้างนักเทียบท่า

ทำตาม symlinks ภายในรูทของคอนเทนเนอร์สำหรับคำแนะนำในการสร้าง ADD

แต่ฉันไม่ได้รับไฟล์หรือไดเรกทอรีดังกล่าวเมื่อฉันสร้างด้วยบรรทัดใดบรรทัดหนึ่งเหล่านี้ใน Dockerfile ของฉัน:

ADD symlink /path/dirname หรือ ADD symlink/file.txt /path/file.txt

ตัวเลือกการติดตั้งจะไม่แก้ปัญหาให้ฉัน (ข้ามแพลตฟอร์ม ... ) ฉันพยายามtar -czh . | docker build -tไม่ประสบความสำเร็จ

มีวิธีทำให้ Docker ทำตาม symlink และคัดลอก common_files / file.txt ไปยังคอนเทนเนอร์ที่สร้างขึ้นหรือไม่?

คำตอบ:


70

ที่เป็นไปไม่ได้และจะไม่มีการดำเนินการ โปรดดูการสนทนาเกี่ยวกับปัญหา github # 1676 :

เราไม่อนุญาตให้ทำเช่นนี้เนื่องจากไม่สามารถทำซ้ำได้ symlink บนเครื่องของคุณไม่เหมือนกับเครื่องของฉันและ Dockerfile เดียวกันจะให้ผลลัพธ์ที่แตกต่างกันสองแบบ นอกจากนี้การมี symlinks ไปยัง / etc / paasswd จะทำให้เกิดปัญหาเนื่องจากจะเชื่อมโยงไฟล์โฮสต์ไม่ใช่ไฟล์ในเครื่องของคุณ


ขอขอบคุณ. ใช่ฉันสังเกตเห็นลิงค์นั้นมาก่อน แต่ฉันคิดว่านั่นเป็นของนักเทียบท่ารุ่นเก่ากว่ามาก (0.6.1) บันทึกการเปลี่ยนแปลงของ 0.10 กล่าวถึงสิ่งนี้เป็นไปได้github.com/docker/docker/blob/master/…
ราวี

นอกจากนี้หากมีการเช็คเอาต์ "parent_dir" ในคอมพิวเตอร์เครื่องใดก็ตามและหาก symlink มีพา ธ สัมพันธ์กับ "common_files" ก็จะสามารถทำซ้ำได้
ราวี

2
คำพูดของคุณFollow symlinks inside container's root for ADD build instructions.หมายความว่าตามด้วยลิงก์สัญลักษณ์ภายในคอนเทนเนอร์ ไม่อยู่ในไดเร็กทอรีบริบทการสร้าง ในADD file.txt /dir/file.txtไดเร็กทอรีdirอาจเป็น symlink ข้อโต้แย้งที่ฉันยกมาในคำตอบของฉันยังคงใช้ได้และลิงก์สัญลักษณ์ยังคงไม่เป็นไปตามในเวอร์ชันล่าสุด คุณอาจทำงานเป็นปัญหา (เกี่ยวกับการทำซ้ำ) เมื่อคุณเก็บ symlinks ในระบบการควบคุมการแก้ไขเช่นคอมไพล์ ดังนั้นโปรดอ้างถึงคำถามนี้
0x7d7b

1
ฉันเห็นประเด็นของคุณเกี่ยวกับ symlinks ในคอมไพล์ แต่ symlinks ไม่จำเป็นต้องเข้าสู่ git สคริปต์การตั้งค่าอย่างง่ายสามารถเตรียม env สร้าง symlink ในเครื่อง สำหรับฉันค่าใช้จ่ายในการเก็บสำเนา 'n' ของไฟล์ที่แชร์นั้นสูงเกินไปจากมุมมองการบำรุงรักษา บางทีฉันอาจจะต้องเสิร์ฟมันจาก apache ขอขอบคุณ.
ราวี

21
สิ่งที่น่าเสียดายในขณะที่ฉันเห็นจุดที่ฉันไม่ทำตามตรรกะและมันก็กัดฉัน Git จัดการ symblinks ได้อย่างสมบูรณ์แบบและฉันยังคาดว่าบิลด์จะทำงานได้กับทุกเครื่องและสภาพแวดล้อมที่มีการตรวจสอบแหล่งที่มา repo .. ?!
Gregor

9

ความเป็นไปได้อย่างหนึ่งคือการรันบิลด์ในไดเร็กทอรีพาเรนต์ด้วย:

$ docker build [tags...] -f dir1/Dockerfile .

(หรือเทียบเท่าในไดเรกทอรีลูก)

$ docker build  [tags...] -f Dockerfile ..

Dockerfile จะต้องได้รับการกำหนดค่าเพื่อทำการคัดลอก / เพิ่มด้วยพา ธ ที่เหมาะสม ขึ้นอยู่กับการตั้งค่าของคุณคุณอาจต้องการให้.dockerignoreในพาเรนต์ละเว้นสิ่งที่คุณไม่ต้องการใส่ลงในบริบท


9

หากใครยังคงมีปัญหานี้ฉันพบวิธีแก้ปัญหาที่ดีมากใน superuser.com:

/superuser/842642/how-to-make-a-symlinked-folder-appear-as-a-normal-folder

โดยพื้นฐานแล้วจะแนะนำให้ใช้ tar เพื่อหักล้าง symlinks และป้อนผลลัพธ์ลงใน Docker build:

$ tar -czh . | docker build -

ฉันได้รับข้อผิดพลาด 2: tar: Failed to clean up compressor,Error response from daemon: the Dockerfile (Dockerfile) cannot be empty
อีวาน Rubinson

3

แทนที่จะใช้ซิมลิงค์เป็นไปได้ที่จะแก้ปัญหาในระดับบริหารโดยเพียงแค่ย้ายไฟล์จาก sites_available ไปยัง sites_enabled แทนการคัดลอกหรือสร้างซิมลิงค์

ดังนั้นการกำหนดค่าไซต์ของคุณจะอยู่ในสำเนาเดียวในโฟลเดอร์ site_available เท่านั้นหากหยุดทำงานหรือบางอย่างหรือใน sites_enabled หากควรใช้


1

ฉันรู้ว่ามันทำลายความสามารถในการพกพาของนักเทียบท่า แต่คุณสามารถใช้ฮาร์ดลิงก์แทนสัญลักษณ์:

ln /some/file ./hardlink

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