Докер: Крепления запрещены. Пути... не являются общими для OS X и не известны Docker
Команда docker run -v /var/folder /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 / folder, который является подмножеством / private, и поэтому добавление отклоняется.
Подводя итог, мне кажется, что каталог / var / folder /.. является общим для OS X как подкаталог / private и, следовательно, должен быть известен Docker. Любая помощь в решении этого будет принята с благодарностью.
В качестве эксперимента я заменил / private в File Sharing на / private / var / folder и перезапустил докер, но результат не изменился.
Просто для более полной ссылки, это скрипт.sh, который запускает этот скрипт на python, который, в свою очередь, запускает команду docker.
19 ответов
Крепления томов 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
bind mounts получены из виртуальной машины Moby Linux, на которой выполняются контейнеры Docker, поэтому такие аргументы, как-v /var/run/docker.sock:/var/run/docker.sock
должен работать как положено. Если путь macOS не является общим и не существует в виртуальной машине, попытка связать монтирование не удастся, а создаст его в виртуальной машине. Пути, которые уже существуют в ВМ и содержат файлы, зарезервированы Docker и не могут быть экспортированы из macOS.
Обратите внимание, что /var/run
здесь упоминается как место, которое будет смонтировано из виртуальной машины Linux, а не из macOS.
Когда вы запрашиваете монтирование тома, сначала проверяется экспорт файловой системы macOS. Если там нет совпадения, то проверяется виртуальная машина Linux, на которой работает Docker. Если ни у одного из них нет пути, который вы запрашивали, то монтирование завершится неудачно.
В твоем случае, /var
не экспортируется macOS. /var
существует в виртуальной машине Linux, но /var/folders
не. Таким образом, путь недоступен, и монтирование не удается.
Если вы измените путь к /private/var
, тогда это удастся, потому что MacOS экспортирует весь /private
дерево файловой системы для монтирования.
Чтобы сделать его более переносимым, вы можете проверить, на какой платформе вы сейчас работаете, и, если это macOS, добавить префикс пути монтирования с помощью /private
,
В новой версии Docker для Mac 3.0.0 вам необходимо отключить использование gRPC FUSE для обмена файлами в меню «Настройки»> «Экспериментальные функции».
У меня была аналогичная проблема, когда я создал каталог /var/tmp
на моем Mac, который я хотел установить в свой контейнер докеров.
Решил это, добавив путь к каталогу к файлу следующим образом:
$ cat ~/Library/Group\ Containers/group.com.docker/settings.json
{
"filesharingDirectories" : [
"\/Users",
"\/Volumes",
"\/private",
"\/tmp",
"\/var\/tmp"
],
…
Теперь я мог видеть каталог /var/tmp
в Docker->preference->resources-> общий доступ к файлам. Затем перезапустил докер.
Затем это решило мою проблему с установкой.
В качестве альтернативного решения:
Измените путь с /private/instance1-data:/home
к ./instance1-data:/home
В мире *nix и, следовательно, в Docker, .
указывает текущий каталог. Поскольку macOS разборчива и становится еще разборчивее в отношении песочницы, это кажется жизнеспособным решением для macOS. Просто создайте папку, необходимую дляinstance1
в том же каталоге.
Еще одним преимуществом этого решения является то, что оно устраняет необходимость запуска docker-compose
с sudo
. Тем не менее, в данном случае это не причинит вреда, но все же это плюс.
удалите версию 20 и загрузите старую стабильную версию https://desktop.docker.com/mac/stable/48506/Docker.dmg
Например, используя 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
вообще не получится. Я думаю (но не уверен), что это потому, что Докер пытается сделать MKDIR. Итак, если я попытаюсь смонтировать -v /var/whatever:/data
, mkdir терпит неудачу, потому что не достаточно разрешения, и это не работает.
У меня есть 2 Mac (High Sierra), и я попробовал это на обоих. Та же проблема. Также я попытался использовать канал Docker Beta. Я думаю, что понимаю ответ Дэна Лоу: я обновлю этот ответ, если это сработает для меня.
если вы не видите папку на Mac, отобразите ее, открыв терминал и введите:
по умолчанию пишет com.apple.Finder AppleShowAllFiles YES
затем перезапустите искатель, удерживая клавишу ALT и щелкнув правой кнопкой мыши (два пальца) по искателю, и выберите перезапустить, затем нажмите «искатель» рядом с файлом в строке меню, нажмите «Настройки», добавьте галочку на жестких дисках в разделе «Показать эти элементы на рабочем столе», затем боковая панель также проверьте жесткие диски, затем перейдите в скрытую папку и перетащите ее в избранное, и она появится в докере> настройки> ресурсы> общий доступ к файлам> + окно
Если у вас все еще есть эта проблема на MAC, попробуйте добавить: $PWD
Добавьте $PWD перед путем к локальному каталогу файлов, например так: docker run -v $PWD / folder /: / path / to / directory.
Вы можете прочитать этот документ с более подробной информацией: https://docs.docker.com/desktop/settings/mac/#file-sharing тома: один относится к текущему компьютеру, другой относится к контейнерам докера, а в Файл настроек Docker /Users уже установлен в настройках Docker для общего доступа к файлам, а на Mac /Users может найти почти все файлы на вашем компьютере.
Я хотел бы добавить, что у меня уже был добавлен путь в Docker, но я решил, что монтирование привязки должно быть абсолютным, а не относительным, и я указывал на несуществующий файл. Я получал ту же ошибку, что и OP.
Если у вас есть файл .env , дважды проверьте константу BASE_PATH, так как она может содержать неверный путь.
# System Configuration
BASE_PATH=/Users/<your_OS_user>/Projects
В моем случае речь шла об этом.
вам нужно добавить оба / private / var / tmp и / var / tmp, чтобы решить проблему
Моя проблема исправлена так же, как и у Аргьи. Мне просто нужно было удалить пути из общего доступа к файлам и перезапустить докер.
Моя проблема исправлена, когда я удалил путь к проекту из общего доступа к файлам в настройках докера и перезапустил докер, а затем снова добавил путь к файлу проекта.
я добавляю папку/builds
кfilesharingDirectories
в~/Library/Group\ Containers/group.com.docker/settings.json
, нравиться:
"filesharingDirectories": [
"/builds",
"/host_mnt",
"/tmp",
"/Users",
"/Volumes",
"/private",
"/var/folders"
],
(я также добавилhost_mnt
)
Затем я добавил обе папки в/
используя файл:
mkdir -p /Users/me/gitlab-misc/builds
mkdir -p /Users/me/gitlab-misc/host_mnt
sudo vim /etc/synthetic.conf
Внутри/etc/synthetic.conf
У меня есть:
builds /Users/me/gitlab-misc/builds
host_mnt /Users/me/gitlab-misc/host_mnt
(Используйте TAB, а не пробел)
sudo chmod 0644 /etc/synthetic.conf
sudo chown root:wheel /etc/synthetic.conf
И перезагрузить машину
С моей стороны: после добавления папки перезапуск терминала и докера решил проблему на моей стороне.
Для netcoreapp убедитесь, что вы поделились /usr/local/share/