LINUX.ORG.RU

Права на volume в docker контейнере

 , ,


0

1

С докером знаком порядочно, но в основном использовал готовые dockerfile's и compose. Собрал теперь свой докерфайл, все собралось, завелось. В имидж при сборке копируется директория с хоста, в случае если нужно будет что-то поменять в конфиге придется чуть с бубном плясать. Захотелось вынести рабочую директорию на хост.

docker run -v /bla/blabla:/root/blabla -ti image /root/blabla/script.sh.
Пример запуска. Тут возникает проблема с правами на директорию blabla. В контейнере под рутом запускается скрипт, а владелец blabla совсем не рут. Как автоматизировать вот это все? Руками делать
chown -R root:root /bla/blabla
и после стартовать контейнер конечно можно, но по мне как-то не красиво)

Вот так

В докер файле у меня прописано вот так и при билде он отдает права на папку под www-data

RUN set -xe && \
        a2enmod rewrite && \
        groupmod -g 1000 www-data && \
        usermod -u 1000 -g 1000 www-data &&\
	chown -R www-data:www-data ./
anonymous
()
Ответ на: комментарий от achilles_85

Папка у меня пробрасывается через docker-compose.yml

  php:
    image: php
    build:
      context: docker/php
    restart: always
    volumes:
    - .:/var/www/html
anonymous
()

Делай не руками. Подсказка: сервису внутри контейнера совсем не обязательно иметь определённый UID. Можно детектить UID/GID файлов в шареной директории и создавать сервисного пользователя с такими же. И всё это в рамках скрипта запуска сервиса.

manntes-live ★★★
()
Ответ на: комментарий от manntes-live

Поподробнее.. Ты говоришь о создании пользователя вне контейнеров и раздаче привилегий им? Можешь какой нибудь пример скинуть чтобы внести ясность?

sky92
()
Ответ на: комментарий от t184256

Маппинг несколько проблематичен, когда надо что бы контейнер работал одинаково и имел R/W доступ в директорию в домике пользователя и на рандомном линуксе, где у тебя нет рута и привелигированых режимов, и на докер-фор-виндоус, и на докере в макоси. Хотя не исключаю, что я просто неосилил.

manntes-live ★★★
()
Последнее исправление: manntes-live (всего исправлений: 1)
Ответ на: комментарий от sky92

Не, в самом контейнере. Шаги простые:
* Создаёшь на хосте шареную директорию в домике пользователя /home/user/share , и в ней какой-нибудь пустой файл-маркер, например /home/user/share/testfile принадлежащий текущему пользователю.
* Запускаешь контейнер с подключением этой шареной директории в /share и точкой входа например /start.sh
* В /start.sh первым делом детектишь числовые значения uid/gid файла /share/testfile в контейнере
* Зная значения, создаёшь пользователя от которого будет работать сервис с такими же uid/gid, как у /share/testfile
* Запускаешь сервис от свежесозданнного пользователя

Важные грабли: имя пользователя для сервиса не должен существовать в контейнере изначально, иначе если у тебя был юзер service с uid:gid 1000:1000 и ты его удаяляешь сразу создавая нового с именем service но uid:gid 1111:1111 например, то где-то похоже застревает старое имя и значения и доступ ломается.

manntes-live ★★★
()
Ответ на: комментарий от manntes-live

Не, с таким зоопарком дела не имел, может на этой экзотике только так и можно.

t184256 ★★★★★
()
Ответ на: комментарий от manntes-live

* В /start.sh первым делом детектишь числовые значения uid/gid файла /share/testfile в контейнере
* Зная значения, создаёшь пользователя от которого будет работать сервис с такими же uid/gid, как у /share/testfile
* Запускаешь сервис от свежесозданнного пользователя

Не осилятор, покажите, пожалуйста, как.

achilles_85
() автор топика
Последнее исправление: achilles_85 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.