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

Docker Скопировать и изменить владельца

Учитывая следующий файл Dockerfile

FROM ubuntu
RUN groupadd mygroup
RUN useradd -ms /bin/bash -G mygroup john
MKDIR /data
COPY test/ /data/test data
RUN chown -R john:mygroup /data
CMD /bin/bash

В моем тестовом каталоге, который скопирован, я установил права доступа к файлам на 770.

Если я делаю su john внутри моего контейнера, я не могу получить доступ к каким-либо из файлов или подкаталогов в моем тестовом каталоге. Похоже, эта проблема связана с владением файловой системой aufs, где скопированный каталог все еще принадлежит root, а разрешения - 770.

Есть ли способ обхода проблемы для правильной установки прав доступа? Можно было бы установить разрешения исходного каталога на uid пользователя контейнера перед его копированием. Но это больше похоже на хак.

4b9b3361

Ответ 1

Я думаю, что нашел решение, которое работает. Использование контейнера данных будет делать трюк. Сначала я создаю контейнер тома данных, который содержит копию моего внешнего каталога:

FROM busybox
RUN mkdir /data
VOLUME /data
COPY /test /data/test
CMD /bin/sh

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

FROM ubuntu
RUN groupadd mygroup
RUN useradd -ms /bin/bash -G mygroup john
COPY setpermissions.sh /root/setpermissions.sh
CMD /root/setpermissions.sh && /bin/bash

В настройках set script выполняется задание прав пользователя:

#!/bin/bash

if [ ! -e /data/.bootstrapped ] ; then
  chown -R john:mygroup /data
  touch /data/.bootstrapped
fi

Теперь я просто должен использовать --volumes-from <myDataContainerId> при запуске контейнера приложения.

Ответ 2

В COPY добавлен флаг --chown:

COPY --chown=patrick foo bar

Этот новый синтаксис работает на Docker 17.09.

Подробнее см. PR.