Подтвердить что ты не робот

Пишите в докеры общих томов

У меня есть докер с php-приложением

У меня есть общий объем, например

/home/me/dev/site <=> /var/www/site

Я могу что-то написать в своем хосте, он будет синхронизироваться с контейнером

если я запустил

sudo docker exec test touch /var/www/site/test.txt

Работает

Но если мой сервер пытается создать файл как www-data, это не работает из-за прав.

Есть ли способ предоставить доступ к моим общим томам к www-data?

Я использую boot2docker

4b9b3361

Ответ 1

(Bind-mounted) тома в Docker будут поддерживать разрешения, которые установлены на хозяин Докера. Вы можете использовать это, чтобы установить разрешения для этих файлы и каталоги перед их использованием в контейнере.

Немного фона;

Разрешения в Linux основаны на идентификаторах пользователей и групп ('uid'/'gid'). Даже хотя вы видите имя пользователя и группы как владельца, эти имена на самом деле не являются важные в Linux, они доступны только для того, чтобы вам было легче узнать, кто является владельцем файла (они выглядят из файла /etc/passwd).

Вы можете установить любой uid/gid в файл; пользователь не должен существовать при настройке этих разрешений. Например:

touch foobar && sudo chown 1234:5678 foobar && ls -la foobar

# UID and GID are set to 1234 / 5678, even though there no such user
-rw-rw-r-- 1 1234 5678 0 Mar 25 19:14 foobar

Проверка разрешений (внутри и снаружи контейнера)

Как упоминалось выше, Docker поддерживает право собственности на хост при использовании том. В этом примере показано, что разрешения и права собственности на томе являются как снаружи, так и внутри контейнера;

# (First create a dummy site)

mkdir -p volume-example/site && cd volume-example
echo "<html><body>hello world</body></html>" > site/index.html

# Permissions on the Docker host;

ls -n site

# total 4
# -rw-rw-r-- 1 1002 1002 38 Mar 25 19:15 index.html

# And, permissions inside a nginx container, using it as volume;

sudo docker run --rm -v $(pwd)/site:/var/www nginx ls -n /var/www

# total 4
# -rw-rw-r-- 1 1002 1002 38 Mar 25 19:15 index.html

Установка разрешений

Как объяснено, пользователю не обязательно существовать, чтобы использовать их, поэтому даже если у нас нет пользователя www-data на хосте Docker, мы все равно можем установить правильное разрешений, если мы знаем "uid" и "gid" этого пользователя внутри контейнера;

Посмотрите, что в контейнере находится uid и gid пользователя www-data;

sudo docker run --rm nginx id www-data

# uid=33(www-data) gid=33(www-data) groups=33(www-data)

Сначала проверьте состояние перед изменением разрешений. На этот раз мы запустите контейнер nginx как пользователь www-data;

sudo docker run \
  --rm \
  --volume $(pwd)/site:/var/www \
  --user www-data nginx touch /var/www/can-i-write.txt

# touch: cannot touch `/var/www/can-i-write.txt': Permission denied

Затем установите разрешения в локальном каталоге и посмотрите, можем ли мы писать:

sudo chown -R 33:33 site

sudo docker run \
   --rm \
   --volume $(pwd)/site:/var/www \
   --user www-data nginx touch /var/www/can-i-write.txt

Успех!

Ответ 2

Добавьте следующие строки в свой файл докеры и восстановите свое изображение

RUN usermod -u 1000 www-data
RUN usermod -G staff www-data