Разрешение отклонено при монтировании тома Docker в OSX

Я в своем уме с этим, так что, надеюсь, вы, ребята, можете мне помочь. В OSX 10.11.2 с docker-machine у ​​меня есть файл docker-compose, который должен создать локальный файл Dockerfile и прикрепить к нему контейнер MySQL. Контейнер MySQL должен монтировать локальную папку, в которой я храню данные своей базы данных, поэтому, если контейнер или виртуальная машина выйдет из строя, я могу просто перезапустить ее без потери данных. Проблема в том, что когда я запускаю его, он выдает ошибку разрешений:

db_1  | 2015-12-23 19:17:59 7facaa89b740  InnoDB: Operating system error number 13 in a file operation.
db_1  | InnoDB: The error means mysqld does not have the access rights to
db_1  | InnoDB: the directory.

Я пробовал все перестановки, которые я могу придумать, чтобы заставить это работать. Я читал, и это может быть как-то связано с тем, как docker-machine обрабатывает разрешения с OSX, но в документации для docker-machine говорится, что он монтирует папку /Users, так что это не должно быть проблемой.

Вот docker-compose.yml:

web:
  build: .
  ports:
    - "3000:3000"
  links:
    - db
db:
  image: mysql:5.6
  ports:
    - "3306:3306"
  volumes:
    - /Users/me/Development/mysql-data:/var/lib/mysql
  environment:
    MYSQL_ROOT_PASSWORD: mypass

Любые идеи? Я не могу не думать, что это что-то очень простое. Любая помощь будет принята с благодарностью!

Изменить:

  • Хозяин - drwxr-xr-x 7 me staff 238 Dec 23 12:10 mysql-data/
  • VM - drwxr-xr-x 1 docker staff 238 Dec 23 20:10 mysql-data/

Что касается контейнера, он не будет работать с подключенным томом. Без крепления -v это:

  • Контейнер - drwxr-xr-x 4 mysql mysql 4096 Dec 24 00:37 mysql

person greggilbert    schedule 23.12.2015    source источник
comment
Вывод ls -lh для каталога данных во всех трех местах (хост, виртуальная машина, контейнер) будет полезен для отладки. Я думаю, что, скорее всего, происходит то, что каталог принадлежит root и не позволяет пользователю mysql создавать новые файлы.   -  person dnephin    schedule 24.12.2015
comment
@dnephin, я обновил вопрос выше данными. Это помогает?   -  person greggilbert    schedule 24.12.2015


Ответы (2)


Проблема, из-за которой это происходит, - это идентификаторы пользователей, используемые Mac и Linux соответственно. Mac не нравится, когда Linux хочет использовать 1 для идентификатора пользователя.

То, как я обошел все безумия разрешений в моей настройке mac + docker-machine, заключается в использовании этого файла Dockerfile.

FROM mysql:5.6

RUN usermod -u 1000 mysql
RUN mkdir -p /var/run/mysqld
RUN chmod -R 777 /var/run/mysqld

Вместо простого образа MySQL 5.6.

Последние 2 строки необходимы, потому что изменение идентификатора пользователя mysql испортит разрешения на сборку для этого изображения. => вам нужны разрешения 777, чтобы запустить его здесь:/

Я знаю, что это немного хакерски, но пока лучшее решение, которое я знаю, для проблемы с разрешениями здесь.

person Armin Braun    schedule 24.12.2015
comment
Хорошо, так что это очень помогло! По крайней мере, изображение остается. Однако я не запускаю его на сокете. Однако без последних двух строк я получаю это: [ERROR] Can't start server : Bind on unix socket: Permission denied [ERROR] Do you already have another mysqld server running on socket: /var/run/mysqld/mysqld.sock ? И тогда это так. Любые идеи? - person greggilbert; 24.12.2015
comment
О, извини, мой плохой. Я смешиваю суп немного здесь. Если вы переключите идентификаторы пользователей, это испортит разрешения, встроенные в базовый образ. ID пользователя 1000 не будет иметь доступа к /var/run/mysqld => вам нужно настроить это вручную. - person Armin Braun; 24.12.2015
comment
спасибо за замечание. При попытке подключения из связанного контейнера отображается ERROR 1130 (HY000): Host '172.17.0.3' is not allowed to connect to this MySQL server, поэтому я думаю, что, может быть, мне также нужно добавить туда свой собственный my.cnf? - person greggilbert; 24.12.2015
comment
Скорее всего это не то. Вы начали с чистой базы данных или в ней уже были пользователи? Скорее всего, первоначальные пользователи этой штуки были созданы таким образом, что удаленный доступ был запрещен. Я бы попробовал перезапустить это с пустым каталогом данных, чтобы исключить эту возможность, прежде чем тратить время на my.cnf. - person Armin Braun; 24.12.2015
comment
Собственно, смена my.cnf помогла. Важно было добавить bind-address = 0.0.0.0. А теперь я могу подключиться и все! Я также пытался уничтожить контейнеры и образы и восстановить их, но данные остались нетронутыми. Большое спасибо за помощь! - person greggilbert; 24.12.2015
comment
@ArminBraun Похоже, это работает хорошо, я попробую!!. Однако есть ли способ избежать жесткого кодирования UID = 1000 в dockerfile? - person alariva; 17.11.2016
comment
@ArminBraun Извините за беспокойство, но я не смог этого сделать, кажется, что mysqld останавливается, когда запуск. Буду благодарен, если подскажете :) My dockerfile - person alariva; 17.11.2016
comment
@alariva, не могли бы вы предоставить журналы для mysqld в вашем случае? Я уверен, что мы сможем понять это оттуда. Вы можете просто добавить что-то вроде || cat /var/log/mysql* в конец вашей команды для запуска mysql. (извините, я не знаю путь журнала наизусть здесь, но он должен быть близок к указанному выше) - person Armin Braun; 17.11.2016
comment
@ArminBraun Спасибо! Конечно, я проверю это и скажу вам. Также дайте мне знать, если вы предпочитаете, чтобы я поднял новый вопрос или перешел в чат, чтобы не троллить эту доску комментариев. - person alariva; 17.11.2016
comment
@ArminBraun Я вставляю вывод и это dockerfile, который я использовал. Похоже на SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock', но я понятия не имею. Спасибо! :) - person alariva; 17.11.2016
comment
@alariva ах, теперь понятно, извините, что упустил очевидное. Вы не можете запустить /etc/init.d/mysql start из раздела RUN (или вообще во время сборки образа при использовании эталонного образа debian)! Посмотрите stackoverflow.com/questions/26938684/ и первый ответ там для более подробной информации. Извините, но вам нужно как-то реорганизовать сборку :( - person Armin Braun; 18.11.2016
comment
@ArminBraun спасибо! Я проверю это! Я считаю, что в этом файле докеров нужно разобраться во многих вещах. Не могли бы вы проверить этот вопрос, так как мне удалось получить желаемое, немного реорганизовав, но я уверен, что есть вероятно, некоторые важные настройки, которые заставят его чувствовать себя менее хакерским. Цените ваши подсказки! - person alariva; 18.11.2016

Попробуйте использовать последнюю версию Docker для Mac вместо инструментов Docker. Docker для Mac больше не использует VirtualBox, а использует HyperKit, облегченное решение для виртуализации OS X, созданное поверх Hypervisor.framework в OS X 10.10 Yosemite и выше.

Я предлагаю также полностью удалить инструменты Docker (они могут сосуществовать): https://github.com/docker/toolbox/blob/master/osx/uninstall.sh

С Docker для Mac вам не нужно использовать взлом разрешений, он просто будет работать так же, как и в сборке Linux.

person Alan    schedule 08.09.2016