Docker: Кріплення заборонено. Шляхи… не є спільними з OS X і не відомі Docker


108

Команда 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.

Коли я відкриваю спільний доступ до файлів, я бачу, що / private вже перелічено.

Якщо я спробую додати /var/folder/, це вирішує /private/var/folders, що є підмножиною / private, а отже, додавання відхиляється.

Підводячи підсумок, мені /var/folders/..здається, що OS X використовує каталог як підкаталог /privateі, отже, повинен бути відомий Docker. Будемо вдячні за будь-яку допомогу у вирішенні цього питання.

В якості експерименту я замінив /privateфайл «Спільний доступ до файлів» на /private/var/foldersта перезапустив докер, але результат не змінився.

Тільки для більш повного посилання, це скрипт .sh , який запускає цей скрипт python , який, у свою чергу, запускає команду docker.


3
Ви пробували -v /private/var/folders/zz/...?
Dan Lowe

@DanLowe: Я не мав, тому що код пішов , як WORKING_DIR="$(mktemp -d)і -v ${WORKING_DIR}. Але злом цього WORKING_DIR="/private"$(mktemp -d), здається, вирішує проблему. Щиро дякую :)
Ааюш

Я надішлю відповідь із поясненням, чому це спрацювало, коли я отримаю кілька хвилин
Ден Лоу

Це було б чудово, ще раз спасибі.
Ааюш

Я зустрічаю те саме повідомлення про помилку. моя ситуація полягає в тому, що не містить місця у вашому каталозі, я зміню "сторону сервера" на "serverSide", тоді це вирішено. сподіваюся, це може комусь допомогти.
andrew54068

Відповіді:


129

Docker для об'ємних кріплень Mac поводиться інакше, ніж базова система Docker. Це здебільшого тому, що Docker намагається відповідати вимогам пісочниці файлової системи Apple.

Як показано в налаштуваннях Docker, 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 для Mac про простори імен файлової системи пояснює:

За замовчуванням, ви можете обмінюватися файлами в /Users/, /Volumes/, /private/та /tmpбезпосередньо. Щоб додати або видалити дерева каталогів, які експортуються в Docker, скористайтеся вкладкою Спільний доступ до файлів у меню налаштувань Docker кит -> Налаштування -> Спільний доступ до файлів. (Див. Налаштування.)

Всі інші шляхи, що використовуються в -vмонтажах прив'язки, походять з Moby Linux VM, що працює з контейнерами Docker, тому аргументи, такі як, -v /var/run/docker.sock:/var/run/docker.sockповинні працювати, як очікувалося. Якщо шлях до macOS не є спільним і не існує у віртуальній машині, спроба прив’язати монтування не вдасться, а не створить у віртуальній машині. Шляхи, які вже існують у віртуальній машині та містять файли, зарезервовані Docker і не можуть бути експортовані з macOS.

Зверніть увагу, що /var/runтут конкретно згадується як місце, яке монтуватиметься з ВМ Linux, а не з macOS.

Коли ви запитуєте підключення тому, спочатку перевіряється експорт файлової системи macOS. Якщо там немає відповідності, далі перевіряється ВМ Linux, де працює Docker. Якщо жоден з них не має шляху, який ви вимагали, монтування не вдається.

У вашому випадку /varmacOS не експортує. /varіснує у віртуальній машині Linux, але /var/foldersне існує. Тому шлях недоступний, і монтування не вдається.

Якщо ви зміните шлях до /private/var, то це вдасться, оскільки macOS експортує все /privateдерево файлової системи для монтування.

Для того, щоб зробити речі більш портативними, ви можете перевірити, на якій платформі ви зараз працюєте, і якщо це macOS, поставте префікс до шляху монтування /private.


4
@ SamuelMéndez Тільки перший. Формат є mac-path:container-pathі /privateіснував би лише на стороні Mac.
Ден Лоу,

2
Я зіткнувся з подібною проблемою, чи може хтось допомогти мені вирішити ("b'Mounts відхилено: \ r \ nШлях / etc / localtime \ r \ nis не надається спільно з OS X і не відомий Docker. \ R \ nВи можете налаштувати спільні шляхи з Docker -> Налаштування ... -> Спільний доступ до файлів. \ r \ nДив. docs.docker.com/docker-for-mac/osxfs/#namespaces для отримання додаткової інформації. \ r \ n. '") спробував додати / тощо через Docker -> Налаштування ... -> Спільний доступ до файлів, в якому сказано, що / etc зарезервовано для Mac OS будь-які рішення хлопці?
Sandish Kumar HN

1
@DanLowe Дякую за відповідь. Якщо я спробую додати / private / etc / localtime, викидає "Шлях експорту / private / etc / localtime перекривається із шляхом експорту / private." Я втомився додавати "/ etc / localtime", але отримав нову помилку: "APIError: 500 Помилка сервера: Внутрішня помилка сервера (" помилка під час створення вихідного шляху монтування '/ etc / localtime': mkdir / etc / localtime: файл існує ") "Будь-яка ідея ??
Sandish Kumar HN


1
@DanLowe Дякуємо за добру відповідь. Я вас розумію. Коли ми розробляємо на Mac OS, розгортаємо на Ubuntu. Ми використовуємо docker-compose для volume / etc / localtime. Ми перевіримо систему і встановимо інший шлях? Як /private/etc/localtimeдля mac os, /etc/localtimeдля ubuntu. Як повідомити системну інформацію в Docker-compose.yml? Дякую!
hzwzw

4

Як альтернативне рішення:

Змініть шлях із /private/instance1-data:/homeна./instance1-data:/home

У * nix land і, отже, Docker, .вказує поточний каталог. Оскільки macOS вибагливий і стає ще більш вибагливим щодо пісочниці, це здається життєздатним рішенням для macOS. Просто створіть папку, необхідну для instance1того самого каталогу.

Ще одна перевага цього рішення полягає в тому , що вона усуває необхідність працювати docker-composeз sudo. Незважаючи на це, це не завдає шкоди в цьому випадку, але все ж це плюс.


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 не вдається, оскільки недостатньо дозволу, і це не працює.

У мене є 2 Mac (High Sierra), і я спробував їх на обох. Та ж проблема. Крім того, я спробував використовувати бета-канал Docker. Думаю, я розумію відповідь Ден Лоу: я оновлю цю відповідь, якщо це мені вдасться.


2

У мене була подібна проблема, коли я створив каталог /var/tmpна своєму Mac, який я хотів встановити в мій контейнер докера.

Вирішив це, додавши шлях до каталогу до файлу наступним чином:

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

Тепер я міг бачити каталог /var/tmpу Docker-> налаштування-> ресурси-> спільний доступ до файлів. Потім я перезапустив докер.

Тоді це вирішило мою проблему монтажу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.