Docker: Mounts ถูกปฏิเสธ เส้นทาง ... ไม่ได้แชร์จาก OS X และ Docker ไม่รู้จัก


113

คำสั่งdocker run -v /var/folders/zz/...สร้างข้อผิดพลาดต่อไปนี้

docker: Error response from daemon: Mounts denied: 
The paths /var/folders/zz/... and /var/folders/zz/...
are not shared from OS X and are not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.

เมื่อฉันเปิดการแชร์ไฟล์ฉันเห็นว่า / ส่วนตัวแสดงอยู่แล้ว

ถ้าฉันพยายามที่จะเพิ่ม/var/folder/มันจะแก้ไขเป็น/private/var/foldersซึ่งเป็นส่วนย่อยของ / ส่วนตัวและด้วยเหตุนี้การเพิ่มจึงถูกปฏิเสธ

โดยสรุปแล้วดูเหมือนว่าฉันจะใช้ไดเร็กทอรีที่/var/folders/..ใช้ร่วมกันโดย OS X เป็นไดเร็กทอรีย่อย/privateและด้วยเหตุนี้ Docker จึงต้องรู้จัก ความช่วยเหลือใด ๆ ในการแก้ไขปัญหานี้จะได้รับการชื่นชม

จากการทดลองฉันแทนที่/privateใน File Sharing /private/var/foldersและรีสตาร์ท Docker แต่ผลลัพธ์ไม่เปลี่ยนแปลง

เพื่อการอ้างอิงที่สมบูรณ์ยิ่งขึ้นนี่คือสคริปต์. shซึ่งรันสคริปต์ python นี้ซึ่งจะรันคำสั่ง docker


3
คุณลอง-v /private/var/folders/zz/...หรือยัง?
Dan Lowe

@ DanLowe: ฉันไม่ได้เพราะรหัสไปเหมือนWORKING_DIR="$(mktemp -d)และ-v ${WORKING_DIR}. แต่การแฮ็กข้อมูลนั้นWORKING_DIR="/private"$(mktemp -d)ดูเหมือนจะช่วยแก้ปัญหาได้ ขอบคุณมาก :)
Aayush

ฉันจะโพสต์คำตอบเพื่ออธิบายว่าทำไมมันถึงใช้งานได้เมื่อฉันได้รับไม่กี่นาที
Dan Lowe

จะดีมากขอบคุณอีกครั้ง
Aayush

ฉันพบข้อความแสดงข้อผิดพลาดเดียวกัน สถานการณ์ของฉันไม่มีที่ว่างในไดเร็กทอรีของคุณฉันเปลี่ยน "ฝั่งเซิร์ฟเวอร์" เป็น "เซิร์ฟเวอร์ไซด์" จากนั้นแก้ไข หวังว่าจะช่วยได้บ้าง
andrew54068

คำตอบ:


139

Docker for Mac volume mount ทำงานแตกต่างจากระบบ Docker ฐาน ส่วนใหญ่เป็นเพราะ Docker พยายามปฏิบัติตามแนวทางแซนด์บ็อกซ์ระบบไฟล์ของ Apple

ตามที่แสดงในการตั้งค่าของนักเทียบท่า macOS จะส่งออกเฉพาะบางเส้นทางเท่านั้น

  • /Users
  • /Volumes
  • /tmp
  • /private

แผงการตั้งค่าการแชร์ไฟล์

/varใน MacOS /privateการเชื่อมโยงสัญลักษณ์ลงใน นอกจากนี้ยังเป็นจริงสำหรับ/tmp:

$ ls -ld /tmp /var
lrwxr-xr-x@ 1 root  wheel  11 Jan 26 16:18 /tmp -> private/tmp
lrwxr-xr-x@ 1 root  wheel  11 Jan 26 16:18 /var -> private/var

เหตุใดจึง/tmpปรากฏในแผงการแบ่งปัน แต่/varไม่มี (แม้ว่าทั้งสองจะเป็นส่วนหนึ่งของ/private) เอกสารของ Docker for Mac เกี่ยวกับเนมสเปซระบบไฟล์อธิบาย:

โดยค่าเริ่มต้นคุณสามารถแบ่งปันไฟล์ใน/Users/, /Volumes/, /private/และ/tmpโดยตรง ในการเพิ่มหรือลบไดเร็กทอรีทรีที่ส่งออกไปยัง Docker ให้ใช้แท็บการแชร์ไฟล์ในเมนูปลาวาฬการตั้งค่า Docker -> การตั้งค่า -> การแชร์ไฟล์ (ดูค่ากำหนด)

เส้นทางอื่น ๆ ทั้งหมดที่ใช้ใน -vเชื่อมโยงการเชื่อมโยงมีที่มาจาก Moby Linux VM ที่รันคอนเทนเนอร์ Dockerดังนั้นอาร์กิวเมนต์เช่น-v /var/run/docker.sock:/var/run/docker.sockควรทำงานได้ตามที่คาดไว้ หากไม่ได้แชร์พา ธ macOS และไม่มีอยู่ใน VM ความพยายามในการเชื่อมโยงเมาท์จะล้มเหลวแทนที่จะสร้างขึ้นใน VM เส้นทางที่มีอยู่แล้วใน VM และมีไฟล์จะถูกสงวนไว้โดย Docker และไม่สามารถส่งออกจาก macOS ได้

โปรดทราบว่า/var/runมีการกล่าวถึงโดยเฉพาะที่นี่ว่าเป็นสถานที่ที่จะติดตั้งจาก Linux VM แทนที่จะเป็นจาก macOS

เมื่อคุณขอการเมานต์โวลุ่มระบบไฟล์ macOS จะถูกตรวจสอบก่อน หากไม่มีข้อมูลตรงกันระบบจะตรวจสอบ Linux VM ที่ Docker กำลังทำงานอยู่ถัดไป หากไม่มีเส้นทางที่คุณร้องขอแสดงว่าการเมานต์ล้มเหลว

ในกรณีของคุณ /var macOS จะไม่ส่งออก /varมีอยู่ใน Linux VM แต่/var/foldersไม่มี ดังนั้นเส้นทางจึงไม่พร้อมใช้งานและการเมาท์ล้มเหลว

หากคุณเปลี่ยนเส้นทางเป็น /private/varก็จะสำเร็จเนื่องจาก macOS ส่งออก/privateโครงสร้างระบบไฟล์ทั้งหมดสำหรับการติดตั้ง

เพื่อที่จะทำให้สิ่งที่พกพามากขึ้นคุณอาจต้องการที่จะทดสอบแพลตฟอร์มที่คุณกำลังทำงานอยู่ในขณะนี้และถ้ามัน MacOS /privateของคำนำหน้าเส้นทางที่ติดกับ


4
@ SamuelMéndezแค่คนแรก. รูปแบบคือmac-path:container-pathและ/privateจะมีอยู่ในฝั่ง Mac เท่านั้น
Dan Lowe

2
ฉันประสบปัญหาที่คล้ายกันนี้สามารถช่วยฉันแก้ไขได้ ("b'Mounts ถูกปฏิเสธ: \ r \ n เส้นทาง / etc / localtime \ r \ n ไม่ได้แชร์จาก OS X และ Docker ไม่รู้จัก \ r \ n คุณสามารถกำหนดค่าเส้นทางที่แชร์ได้ จาก Docker -> ค่ากำหนด ... -> การแชร์ไฟล์ \ r \ n ดูdocs.docker.com/docker-for-mac/osxfs/#namespacesสำหรับข้อมูลเพิ่มเติม \ r \ n. '") ลองเพิ่ม / etc ผ่าน นักเทียบท่า -> การตั้งค่า ... -> การแชร์ไฟล์มันบอกว่า / etc สงวนไว้สำหรับ mac os โซลูชันใด ๆ ?
Sandish Kumar HN

1
@DanLowe ขอบคุณสำหรับการตอบกลับ ถ้าฉันพยายามเพิ่ม / private / etc / localtime กำลังโยน "เส้นทางการส่งออก / private / etc / localtime ทับซ้อนกับเส้นทางการส่งออก / private" ฉันเบื่อที่จะเพิ่ม "/ etc / localtime" แต่มีข้อผิดพลาดใหม่ที่ระบุว่า "APIError: 500 Server Error: Internal Server Error (" error while create mount source path '/ etc / localtime': mkdir / etc / localtime: file existing ") "ไอเดียไหน ??
Sandish Kumar HN

2
ขอให้เรายังคงอภิปรายนี้ในการแชท
Sandish Kumar HN

1
@DanLowe ขอบคุณสำหรับคำตอบ ฉันเข้าใจคุณ. เมื่อเราพัฒนาบน Mac OS ให้ปรับใช้บน Ubuntu เราใช้ docker-compose กับ volume / etc / localtime เราจะตรวจสอบระบบและกำหนดเส้นทางอื่นหรือไม่? เช่นเดียวกับ/private/etc/localtimemac os /etc/localtimeสำหรับ ubuntu จะบอกข้อมูลระบบใน Docker-compose.yml ได้อย่างไร? ขอขอบคุณ!
hzwzw

14

ด้วย Docker for mac เวอร์ชันใหม่ 3.0.0 คุณต้องปิดการใช้งานการใช้ gRPC FUSE สำหรับการแชร์ไฟล์ในการตั้งค่า> คุณลักษณะการทดลอง


4
เพียงอัปเดต Docker เป็นเวอร์ชัน 3.0.1
ชาด

6

เป็นทางเลือกอื่น :

เปลี่ยนเส้นทางจาก/private/instance1-data:/homeเป็น./instance1-data:/home

ในที่ดิน * nix และด้วยเหตุนี้ Docker จึง.ระบุไดเร็กทอรีปัจจุบัน เนื่องจาก macOS มีความพิถีพิถันในการเลือกแซนด์บ็อกซ์มากขึ้นสิ่งนี้จึงดูเหมือนเป็นวิธีแก้ปัญหาสำหรับ macOS เพียงสร้างโฟลเดอร์ที่จำเป็นสำหรับinstance1ในไดเร็กทอรีเดียวกัน

ประโยชน์ของการแก้ปัญหานี้ก็คือว่ามันจะเอาความจำเป็นในการทำงานด้วยdocker-compose sudoไม่ว่าจะไม่ก่อให้เกิดอันตรายใด ๆ ในกรณีนี้ แต่ก็ยังเป็นข้อดี


6

ถอนการติดตั้งเวอร์ชัน 20 และดาวน์โหลดเวอร์ชันเก่าที่เสถียรhttps://desktop.docker.com/mac/stable/48506/Docker.dmg


มีเวอร์ชันใหม่กว่าที่ระบุไว้ที่นี่: docs.docker.com/docker-for-mac/release-notes (เวอร์ชัน 3.0 ทำให้การตั้งค่านักเทียบท่าของฉันพัง)
risa_risa

1
เวอร์ชัน 3.0 ทำลายการตั้งค่านักเทียบท่าของฉันด้วย ได้รับข้อผิดพลาดในการเขียนเทียบท่าพยายามต่อเชื่อมโฟลเดอร์ ฉันกลับไปที่เวอร์ชัน 2.4.0
kenecaswell

5
วิธีแก้ปัญหาอื่นคือปิดใช้งาน "ใช้ gRPC Fuse สำหรับการแชร์ไฟล์" ภายใต้ "Experimental Features" ใน Docker Preferences
Mohit Rajan

แม้ว่าลิงก์นี้อาจตอบคำถามได้ แต่ควรรวมส่วนสำคัญของคำตอบไว้ที่นี่และระบุลิงก์เพื่อการอ้างอิง คำตอบแบบลิงก์เท่านั้นอาจไม่ถูกต้องหากหน้าที่เชื่อมโยงเปลี่ยนไป - จากรีวิว
ÇağatayBarın

5

ฉันมีปัญหาที่คล้ายกันซึ่งฉันได้สร้างไดเร็กทอรี/var/tmpใน Mac ซึ่งฉันต้องการติดตั้งในคอนเทนเนอร์นักเทียบท่า

แก้ไขได้โดยการเพิ่มพา ธ ไดเร็กทอรีไปยังไฟล์ดังนี้:

$ cat ~/Library/Group\ Containers/group.com.docker/settings.json  
{
  "filesharingDirectories" : [
    "\/Users",
    "\/Volumes",
    "\/private",
    "\/tmp",
    "\/var\/tmp"
  ],
…

ตอนนี้ฉันสามารถเห็นไดเร็กทอรี /var/tmpใน Docker-> การตั้งค่า -> ทรัพยากร -> การแชร์ไฟล์ จากนั้นฉันรีสตาร์ทนักเทียบท่า

จากนั้นแก้ไขปัญหาการติดตั้งของฉัน


ฉันมีปัญหานี้ในโครงการที่ด้วยเหตุผลทางประวัติศาสตร์ที่จำเป็นในการเมานต์ไปยังพา ธ ที่รูทคือ / product_name ฉันติดตามการแก้ไข MacOS สิ่งนี้ยังไม่เพียงพอเนื่องจาก Docker UI ไม่อนุญาตให้คุณเลือก symlink โดยใช้กล่องโต้ตอบการเลือกไฟล์ finder ฉันต้องแก้ไขเส้นทางไฟล์โดยใช้ไฟล์ json ตามที่อธิบายไว้
Rob

2

ตัวอย่างเช่นการใช้ Portainer คำสั่งนี้ใช้ได้กับฉัน:

docker run -d --restart unless-stopped -p 9000:9000 \
 -v /var/run/docker.sock:/var/run/docker.sock \
 -v /var:/data portainer/portainer --no-auth

แต่ถ้าฉันเปลี่ยน-v /var:/dataทั้งหมดมันจะไม่ทำงาน ฉันคิดว่า (แต่ไม่แน่ใจ) ว่าเป็นเพราะ Docker พยายามทำ mkdir ดังนั้นหากฉันพยายามเมาน-v /var/whatever:/dataต์ mkdir ล้มเหลวเนื่องจากได้รับอนุญาตไม่เพียงพอและไม่ได้ผล

ฉันมี Mac 2 เครื่อง (High Sierra) และฉันลองใช้ทั้งสองอย่าง ปัญหาเดียวกัน. นอกจากนี้ฉันลองใช้ช่อง Docker Beta ฉันคิดว่าฉันเข้าใจคำตอบของ Dan Lowe: ฉันจะอัปเดตคำตอบนี้ถ้ามันเหมาะกับฉัน


0

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


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