Docker: Mounts bị từ chối. Các đường dẫn… không được chia sẻ từ OS X và Docker không biết


107

Lệnh docker run -v /var/folders/zz/...tạo ra lỗi sau.

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.

Khi tôi mở Chia sẻ tệp, tôi thấy rằng / riêng tư đã được liệt kê.

Nếu tôi cố gắng thêm /var/folder/, nó sẽ giải quyết thành /private/var/folders, là một tập con của / private và do đó việc bổ sung bị từ chối.

Tóm lại, đối với tôi, có vẻ như thư mục /var/folders/..được chia sẻ bởi OS X dưới dạng một thư mục con /privatevà do đó, Docker phải biết. Bất kỳ trợ giúp nào về việc giải quyết vấn đề này sẽ được đánh giá cao.

Như một thử nghiệm, tôi đã thay thế /privatetrong File Sharing bằng /private/var/foldersvà khởi động lại docker nhưng kết quả không thay đổi.

Chỉ để tham khảo đầy đủ hơn, đây là tập lệnh .sh , chạy tập lệnh python này , lần lượt chạy lệnh docker.


3
Bạn đã thử -v /private/var/folders/zz/...?
Dan Lowe

@DanLowe: Tôi không có, bởi vì mã giống như WORKING_DIR="$(mktemp -d)-v ${WORKING_DIR},. Nhưng hack điều đó WORKING_DIR="/private"$(mktemp -d), dường như giải quyết được vấn đề. Cảm ơn bạn rất nhiều :)
Aayush

Tôi sẽ đăng một câu trả lời giải thích lý do tại sao nó làm việc khi tôi nhận được một vài phút
Dan Lowe

Điều đó thật tuyệt, cảm ơn một lần nữa.
Aayush

Tôi gặp phải thông báo lỗi tương tự. tình huống của tôi là không chứa bất kỳ khoảng trống nào trong thư mục của bạn, tôi thay đổi "phía máy chủ" thành "phía máy chủ" thì nó đã được giải quyết. hy vọng nó có thể giúp một số người.
andrew54068

Câu trả lời:


129

gắn kết khối lượng Docker cho Mac hoạt động khác với hệ thống Docker cơ sở. Điều này chủ yếu là do Docker cố gắng tuân thủ các nguyên tắc hộp cát hệ thống tệp của Apple.

Như được hiển thị trong tùy chọn của Docker, chỉ một số đường dẫn nhất định được xuất bởi macOS.

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

Bảng tùy chọn Chia sẻ Tệp

/vartrong macOS là một liên kết tượng trưng vào /private. Điều đó cũng đúng với /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

Tại sao được /tmpliệt kê trong bảng điều khiển chia sẻ, nhưng /varkhông được liệt kê (mặc dù cả hai đều là một phần của /private)? Tài liệu của Docker cho Mac về không gian tên hệ thống tệp giải thích:

Theo mặc định, bạn có thể chia sẻ file trong /Users/, /Volumes/, /private/, và /tmptrực tiếp. Để thêm hoặc xóa cây thư mục được xuất sang Docker, hãy sử dụng tab Chia sẻ tệp trong menu cá voi tùy chọn Docker -> Tùy chọn -> Chia sẻ tệp. (Xem Tùy chọn.)

Tất cả các đường dẫn khác được sử dụng trong -v liên kết gắn kết đều có nguồn gốc từ Moby Linux VM đang chạy các vùng chứa Docker, vì vậy các đối số như -v /var/run/docker.sock:/var/run/docker.socksẽ hoạt động như mong đợi. Nếu một đường dẫn macOS không được chia sẻ và không tồn tại trong VM, nỗ lực liên kết mount nó sẽ không thành công thay vì tạo nó trong VM. Các đường dẫn đã tồn tại trong máy ảo và chứa các tệp được Docker bảo lưu và không thể xuất từ ​​macOS.

Lưu ý rằng /var/runđược đề cập cụ thể ở đây như một nơi sẽ được gắn kết từ Linux VM, thay vì từ macOS.

Khi bạn yêu cầu gắn kết khối lượng, trước tiên, xuất khẩu hệ thống tệp macOS sẽ được kiểm tra. Nếu không khớp ở đó, máy ảo Linux nơi Docker đang chạy sẽ được chọn tiếp theo. Nếu cả hai đều không có đường dẫn bạn yêu cầu, thì quá trình gắn kết không thành công.

Trong trường hợp của bạn, /var không được xuất bởi macOS. /vartồn tại trong Linux VM, nhưng /var/folderskhông. Do đó, đường dẫn không khả dụng và quá trình gắn kết bị lỗi.

Nếu bạn thay đổi đường dẫn thành /private/var , thì nó sẽ thành công, vì macOS xuất toàn bộ /privatecây hệ thống tệp để gắn kết.

Để làm cho mọi thứ trở nên linh hoạt hơn, bạn có thể muốn kiểm tra nền tảng bạn hiện đang chạy và nếu đó là macOS, hãy đặt trước đường dẫn gắn kết với /private.


4
@ SamuelMéndez Chỉ là người đầu tiên. Định dạng này mac-path:container-path/privatesẽ chỉ tồn tại trên máy Mac của nó.
Dan Lowe

2
Tôi đang gặp phải vấn đề tương tự, có ai có thể giúp tôi giải quyết không ("b'Độ bị từ chối: \ r \ nĐường dẫn / etc / localtime \ r \ ni không được chia sẻ từ OS X và Docker không biết. \ R \ nBạn có thể định cấu hình đường dẫn được chia sẻ từ Docker -> Preferences ... -> File Sharing. \ r \ nXem docs.docker.com/docker-for-mac/osxfs/#namespaces để biết thêm thông tin. \ r \ n. '") đã thử thêm / etc qua Docker -> Preferences ... -> File Sharing nó nói / etc được dành riêng cho mac os bất kỳ giải pháp nào?
Sandish Kumar HN

1
@DanLowe Cảm ơn bạn đã phản hồi. Nếu tôi cố gắng thêm / private / etc / localtime thì thông báo "Đường dẫn xuất / private / etc / localtime chồng chéo với đường dẫn xuất / private." Tôi đã mệt mỏi khi thêm "/ etc / localtime" nhưng lại gặp lỗi mới, thông báo "APIError: 500 Server Error: Internal Server Error (" lỗi khi tạo đường dẫn nguồn gắn kết '/ etc / localtime': mkdir / etc / localtime: tệp tồn tại ") " Bất kỳ ý tưởng??
Sandish Kumar HN


1
@DanLowe Cảm ơn bạn đã trả lời tận tình. Tôi hiểu bạn. Khi chúng tôi phát triển trên Mac OS, hãy triển khai trên Ubuntu. Chúng tôi sử dụng docker-soạn thành volume / etc / localtime. Chúng ta sẽ kiểm tra hệ thống và thiết lập đường dẫn khác? Giống như /private/etc/localtimecho mac os, /etc/localtimecho ubuntu. Làm cách nào để cho biết thông tin hệ thống trong Docker-compos.yml? Cảm ơn bạn!
hzwzw

4

Như một giải pháp thay thế :

Thay đổi đường dẫn từ /private/instance1-data:/homethành./instance1-data:/home

Trong vùng đất * nix và do đó, Docker, .biểu thị thư mục hiện tại. Vì macOS khá kén chọn nên thậm chí còn kén chọn hơn về hộp cát, đây có vẻ như là một giải pháp khả thi cho macOS. Chỉ cần tạo thư mục cần thiết instance1trong cùng một thư mục.

Một ưu điểm khác của giải pháp này là nó loại bỏ sự cần thiết phải chạy docker-composevới sudo. Dù vậy, nó không gây hại gì trong trường hợp này nhưng đó vẫn là một điểm cộng.


2

Ví dụ, sử dụng Portainer, lệnh này phù hợp với tôi:

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

Nhưng, nếu tôi thay đổi -v /var:/datachút nào, nó sẽ không hoạt động. Tôi nghĩ (nhưng không chắc) rằng đó là do Docker đang cố gắng thực hiện mkdir. Vì vậy, nếu tôi cố gắng gắn kết-v /var/whatever:/data , mkdir không thành công vì không đủ quyền và nó không hoạt động.

Tôi có 2 máy Mac (High Sierra) và tôi đã thử nó trên cả hai. Cùng một vấn đề. Ngoài ra, tôi đã thử sử dụng kênh Docker Beta. Tôi nghĩ tôi hiểu câu trả lời của Dan Lowe: Tôi sẽ cập nhật câu trả lời này nếu điều đó phù hợp với tôi.


2

Tôi đã gặp sự cố tương tự khi tôi đã tạo một thư mục /var/tmp trong máy Mac mà tôi muốn gắn vào vùng chứa docker của mình.

Đã giải quyết nó bằng cách thêm đường dẫn thư mục vào một tệp như sau:

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

Bây giờ tôi có thể thấy thư mục /var/tmp trong Docker-> tùy chọn-> tài nguyên-> chia sẻ tệp. Sau đó, tôi khởi động lại docker.

Sau đó nó đã giải quyết được vấn đề gắn kết của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.