Дополнение A. Различия платформ

Хотя Docker и стремится к полной независимости платформы, существует по крайней мере один стоящий замечания способ, которым отличаются его платформы. Давайте быстро взглянем на него и рассмотрим как с ним обходиться.

Владельцы файлов и полномочия

Когда дело доходит до владения файлами и полномочиями на них, существуют некие тонкие отличия в том как их обрабатывают платформы Docker (Mac, Linux и Windows). Эти отличия могут вызывать проблемы при записи файлов в некий монтируемый том изнутри контейнера.

Эта проблема проистекает из того факта, что обычно существуют различные учётный записи пользователя, которые применяются внутри контейнера и за его пределами. Обычно в своей локальной машине вы применяете учётную запись своего обычного пользователя, но внутри контейнера пользователем по умолчанию в данном контейнере является учётная запись root. Это означает, что создаваемые внутри данного контейнера файлы имеют владельцем данного пользователя root.

Когда вы покидаете данный контейнер, основной вопрос состоит в том, будете ли вы способны изменять те файлы, владельцем которых является root? Окончательный ответ слегка отличается для каждой из платформ.

В Docker для Windows, те файлы, которые созданы внутри данного контейнера имеют права доступа к файлу, которые позволяют им подлежать изменениям кем угодно (что эквивалентно правам доступа к файлу в Unix 777). Это означает, что нет никаких проблем с использованием и изменением этих файлов вне данного контейнера.

Docker для Mac применяет свою собственную обособленную систему совместного использования файлов с названием osxfs. Она слегка обманывает с тем, чтобы выглядеть как будто все монтируемые файлы находятся во владении какого- то пользователя в том контейнере, который осуществляет к ним доступ/ создал их. Тем не менее, в действительности, эти файлы в вашей локальной файловой системе пребывают во владении какой- то учётной записи пользователя macOS, который и владеет ими. На практике это означает, монтируемые файлы доступны и на чтение, и на запись как изнутри, так и извне данного контейнера без необходимости изменения их владельца.

В Linux нет никакой магии или трюков чтобы обособлять вас от различий владения файлами внутри контейнера и за его пределами в вашей локальной машине. Если файлы внутри контейнера принадлежат root, то вне данного контейнера их владельцем всё ещё является root. Нам всегда приходится что- то предпринимать чтобы обеспечить изменяемость сгенерированных внутри контейнера файлов за его пределами.

Мы можем предпринять один из двух подходов:

  1. Воспользоваться возможностью --user "$(id -u):$(id -g)", которая исполняет необходимую команду с идентификаторами вашего локального пользователя и его группы- например:

    
    ​ 	​$ ​​docker-compose​​ ​​exec​​ ​​--user​​ ​​"$(id -u):$(id -g)"​​ ​​web​​ ​​\​
    ​ 	​      ​​bin/rails​​ ​​generate​​ ​​controller​​ ​​welcome​​ ​​index​
     	   
  2. Выполнить chown для этих файлов запустив следующее из корня своего Rails:

    
    ​ 	​$ ​​sudo​​ ​​chown​​ ​​<your_user>:<your_group> ​​-R​​ ​​.​
     	   

Что касается лично меня, последнее мне кажется более честным и именно это я и предлагаю на протяжении всей книги. Для того чтобы сэкономить на наборе, вы даже можете создать некий псевдоним задачи Rake или команды оболочки.