วิธีสร้างโฟลเดอร์ symlinked จะปรากฏเป็นโฟลเดอร์ปกติ


38

ฉันมีแอพพลิเคชั่น Dart สองตัวที่ฉันต้องเทียบท่า แอพทั้งสองนี้ใช้ไดเรกทอรีแหล่งข้อมูลที่แชร์
เนื่องจาก Docker ป้องกันการเพิ่มไฟล์จากโฟลเดอร์นอกไดเรกทอรีบริบท ( project/app1) ฉันไม่สามารถเพิ่มไฟล์จาก../sharedหรือจากshared(symlink ด้านในprojects/app1)

ฉันกำลังมองหาวิธีที่จะหลอกนักเทียบท่าให้ทำมันอยู่ดี

โครงสร้างโครงการที่เรียบง่ายของฉัน

- projects
  - app1
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - app2
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - shared
    - source

ฉันสามารถเลื่อนDockerfileขึ้นหนึ่งระดับและเรียกใช้docker buildจากที่นั่น แต่แล้วฉันต้องการ Dockerfiles สองอัน (สำหรับ app1 และ app2) ในไดเรกทอรีเดียวกัน

แนวคิดปัจจุบันของฉันคือถ้าฉันสามารถซ่อนความจริงที่projects/app1/sharedเป็น symlink ปัญหานี้จะแก้ไขได้ ฉันตรวจสอบว่าฉันสามารถแชร์projectsโดยใช้ Samba และทำการติดตั้งใหม่ที่อื่นและกำหนดค่า Samba เพื่อรักษา symlink เช่นโฟลเดอร์ปกติ แต่ไม่พบว่ามีการรองรับหรือไม่ (ฉันยังไม่เคยลอง Samba มาก่อน .

มีเครื่องมือหรือเคล็ดลับอื่น ๆ ที่จะอนุญาตหรือไม่

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

คำตอบ:


35

ฉันไม่ได้มีประสบการณ์มากมายdockerดังนั้นฉันจึงไม่สามารถรับประกันได้ว่าสิ่งนี้จะใช้ได้ แต่มีทางเลือกหนึ่งคือติดไดเรกทอรีแทนการเชื่อมโยงไปยัง:

$ cd projects/app1
$ mkdir shared
$ sudo mount -o bind ../shared shared/

ที่จะแนบ../sharedไป./sharedและควรจะสมบูรณ์โปร่งใสให้กับระบบ ตามที่อธิบายไว้ในman mount:

ผูกติด

ตั้งแต่ Linux 2.4.0 เป็นไปได้ที่จะประกอบชิ้นส่วนของลำดับชั้นไฟล์ที่อื่น การโทรคือ:

mount --bind olddir newdir

หรือโดยใช้รายการ fstab นี้:

/olddir /newdir none bind

หลังจากการโทรนี้เนื้อหาเดียวกันสามารถเข้าถึงได้ในสองสถานที่


1
@zoechi นี่เป็นหัวข้อที่สมบูรณ์ในเว็บไซต์ทั้งสองแห่ง ตามกฎทั่วไปฉันจะโพสต์คำถามทางเทคนิคเพิ่มเติมเช่นนี้ใน U&L และคำถามเพิ่มเติมเกี่ยวกับพื้นที่ผู้ใช้ที่นี่ ทางเลือกนั้นขึ้นอยู่กับคุณอย่างสมบูรณ์ ในอีกด้านหนึ่งมีผู้ใช้จำนวนมากที่นี่มีลูกตามากขึ้นในอีกด้านหนึ่งมีความสนใจระดับมืออาชีพ * ระวังใน U&L มากขึ้น ตรวจสอบให้แน่ใจว่าคุณไม่ได้โพสต์คำถามเดียวกันทั้งสองเว็บไซต์ หากคุณต้องการย้ายให้ลบสิ่งนี้หรือตั้งค่าสถานะเพื่อให้ความสนใจ mod และขอให้พวกเขาโยกย้าย
terdon

2
มันเป็นข้อบังคับสำหรับฉันที่จะรีสตาร์ท daemon นักเทียบท่า! อื่น dir ที่เมานต์จะไม่ปรากฏในคอนเทนเนอร์
สลัว

@dim ใช่! ฉันพยายามทำให้มันทำงานร่วมกับ Capistrano และมันใช้งานไม่ได้ - กลับกลายเป็นว่าฉันติดตั้งไดเรกทอรีที่ใช้ร่วมกันหลังจากที่ฉันเริ่มต้นคอนเทนเนอร์
csch

น่าเสียดายที่นี่ใช้ไม่ได้กับผู้ใช้ Windows หรือ OS X การอภิปรายเกี่ยวกับปัญหานี้ ... มีชีวิตชีวา
เจสัน

จะผูกติด 'มุ่งมั่น' เพื่อการควบคุมแหล่งเช่น Github? หรือฉันต้องทำทุกครั้ง
pie6k

23

ปัญหานี้เกิดขึ้นซ้ำ ๆ ในชุมชนนักเทียบท่า มันเป็นการละเมิดข้อกำหนดที่Dockerfileสามารถทำซ้ำได้หากคุณเรียกใช้หรือฉันเรียกใช้ ดังนั้นผมจะไม่คาดหวังความสามารถตามที่อธิบายไว้ในตั๋วนี้: Dockerfile คำสั่งใส่ไม่ปฏิบัติตาม symlinks บนโฮสต์ #

ดังนั้นคุณต้องเข้าใจวิธีการที่แตกต่างกัน ถ้าคุณดูที่ปัญหานี้: เพิ่มใน symlinks สนับสนุนในอาร์กิวเมนต์ # 6094ซึ่งเป็นเพื่อนของเราจาก U & L ( @ แพทริก aka. phemmer) มีวิธีแก้ปัญหาที่ฉลาด

$ tar -czh . | docker build -

สิ่งนี้บอกtarให้ยกเลิกการอ้างอิงลิงก์สัญลักษณ์จากไดเร็กทอรีปัจจุบันจากนั้นไพพ์ลิงก์ทั้งหมดไปยังdocker build -คำสั่ง

ตัดตอนมาจากหน้าคน tar
-c, --create
       create a new archive

-h, --dereference
       follow symlinks; archive and dump the files they point to

-z, --gzip, --gunzip --ungzip

3
นี่คือทางออกที่ยอดเยี่ยม! ฉันเข้าใจว่าทำไมนักเทียบท่าอ้างว่าพวกเขาต้องการละเว้นคุณลักษณะนี้ อย่างไรก็ตามมีความแตกต่างอย่างมากในเวิร์กโฟลว์ที่ฉันใช้ขณะพัฒนาโครงการ containerize ของฉันและฉันคาดหวังว่ามันจะถูกสร้างขึ้นเพื่อการผลิต บนเครื่องในท้องถิ่นของฉันฉันต้องการห่วงข้อเสนอแนะที่แน่นสุด แอพของฉันมี repo 1 git และสภาพแวดล้อมการสร้างสำหรับคอนเทนเนอร์มี repo ที่สอง ฉันต้องสามารถแก้ไขและสร้างการทดสอบในพื้นที่ได้ก่อนที่จะตัดสินใจได้ว่าต้องการมอบหมายและผลักดันหรือไม่ ฉันจะไม่มี symlink หรือคำแนะนำเพิ่มในโครงการสุดท้ายของฉัน
Bruno Bronosky

6
Dockerfiles ไม่สามารถทำซ้ำได้ Dockerfiles นั้นไม่สามารถทำซ้ำได้เพราะเกือบทุกคนมี apt-get หรืออะไรที่เทียบเท่าในชั้นที่ 2 หรือ 3 และ apt-get นั้นไม่สามารถทำซ้ำได้ การคาดคะเนกลยุทธ์การพัฒนานักเทียบท่าเป็นความพยายามที่เข้าใจผิดที่จะทำให้สิ่งที่เป็นไปไม่ได้จริงเกิดขึ้นได้เพียงแค่นักเทียบท่าด้วยชุดของนามธรรมที่ไม่ดีซึ่งจะช่วยให้ไม่มีใคร nathanleclaire.com/blog/2014/09/29/…
Jason

1
ตกลงดังนั้นฉันไม่เห็นว่าทำไมสิ่งนี้ถึงดีกว่าcpคำสั่งคุณช่วยอธิบายได้ไหมว่าทำไมถึงดีกว่า ฉันยังคิดว่าท่อทำให้สับสน / ซับซ้อนเกินไป ทำไมไม่วางคำสั่ง tar ไว้เหนือคำสั่ง build ฉันเดาเพราะถ้าอย่างนั้นคุณจะเขียนทับ dir symlinked กับ dir ตัวจริง
Alexander Mills

1
@AlexanderMills - วิธีที่ดีที่สุดในการดูว่าเกิดอะไรขึ้นคือลองทำดูความแตกต่าง นอกจากนี้ข้างต้นเป็นอาคารของภาชนะที่ไม่ได้ทำงานอยู่ดังนั้นจึงไม่มีการติดตั้ง stackoverflow.com/questions/37328370/… . ฉันขอแนะนำให้คุณลองทำทุกสิ่งเหล่านี้มันจะสมเหตุสมผลมากกว่านี้
slm

1
ฉันเพิ่งเพิ่ม/bin/cp ../requirements.txt . && docker build ...Makefile เพื่อสร้าง Docker มันง่ายขึ้น
user5359531
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.