Дополнение A. Различия платформ
Хотя Docker и стремится к полной независимости платформы, существует по крайней мере один стоящий замечания способ, которым отличаются его платформы. Давайте быстро взглянем на него и рассмотрим как с ним обходиться.
Когда дело доходит до владения файлами и полномочиями на них, существуют некие тонкие отличия в том как их обрабатывают платформы Docker (Mac, Linux и Windows). Эти отличия могут вызывать проблемы при записи файлов в некий монтируемый том изнутри контейнера.
Эта проблема проистекает из того факта, что обычно существуют различные учётный записи пользователя, которые
применяются внутри контейнера и за его пределами. Обычно в своей локальной машине вы применяете учётную запись
своего обычного пользователя, но внутри контейнера пользователем по умолчанию в данном контейнере является
учётная запись root
. Это означает, что создаваемые внутри данного контейнера
файлы имеют владельцем данного пользователя root
.
Когда вы покидаете данный контейнер, основной вопрос состоит в том, будете ли вы способны изменять те файлы, владельцем
которых является root
? Окончательный ответ слегка отличается для каждой из
платформ.
В Docker для Windows, те файлы, которые созданы внутри данного контейнера имеют права доступа к файлу, которые
позволяют им подлежать изменениям кем угодно (что эквивалентно правам доступа к файлу в Unix
777
). Это означает, что нет никаких проблем с использованием и изменением этих
файлов вне данного контейнера.
Docker для Mac применяет свою собственную обособленную систему совместного использования файлов с названием
osxfs
.
Она слегка обманывает с тем, чтобы выглядеть как будто все монтируемые файлы находятся во владении какого- то
пользователя в том контейнере, который осуществляет к ним доступ/ создал их. Тем не менее, в действительности, эти файлы в вашей локальной
файловой системе пребывают во владении какой- то учётной записи пользователя macOS, который и владеет ими. На практике
это означает, монтируемые файлы доступны и на чтение, и на запись как изнутри, так и извне данного контейнера без необходимости
изменения их владельца.
В Linux нет никакой магии или трюков чтобы обособлять вас от различий владения файлами внутри контейнера и за его пределами
в вашей локальной машине. Если файлы внутри контейнера принадлежат root
, то
вне данного контейнера их владельцем всё ещё является root
. Нам всегда приходится
что- то предпринимать чтобы обеспечить изменяемость сгенерированных внутри контейнера файлов за его пределами.
Мы можем предпринять один из двух подходов:
-
Воспользоваться возможностью
--user "$(id -u):$(id -g)"
, которая исполняет необходимую команду с идентификаторами вашего локального пользователя и его группы- например: $ docker-compose exec --user "$(id -u):$(id -g)" web \ bin/rails generate controller welcome index
-
Выполнить
chown
для этих файлов запустив следующее из корня своего Rails: $ sudo chown <your_user>:<your_group> -R .
Что касается лично меня, последнее мне кажется более честным и именно это я и предлагаю на протяжении всей книги. Для того чтобы сэкономить на наборе, вы даже можете создать некий псевдоним задачи Rake или команды оболочки.