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 пользователя контейнера перед его копированием. Но это больше похоже на хак.
Ответы
Ответ 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.