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


person Christian Metzler    schedule 05.03.2015    source источник
comment
перед COPY и MKDIR я думаю, у вас должен быть USER john   -  person user2915097    schedule 05.03.2015
comment
Возможно, это могло бы сработать, но мне пришлось бы создать полную структуру каталогов, которая копируется, и поэтому это неприемлемо.   -  person Christian Metzler    schedule 06.03.2015


Ответы (2)


Наконец-то к COPY был добавлен флаг --chown:

COPY --chown=patrick hostPath containerPath

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

Дополнительную информацию см. в PR.

person Georgi Hristozov    schedule 03.10.2017
comment
для меня это работало с --chown=user:group , я создал этого пользователя и группу в контейнере - person Charan; 19.10.2017
comment
Спасибо за этот комментарий, я использовал обычный синтаксис user.group, и это не сработало, рад, что наткнулся на это. - person Torque; 31.07.2019
comment
@Torque Где user.group нормальный синтаксис? . обычно принимается как часть имени пользователя, поэтому мне немного подозрительно / любопытно, почему его можно использовать в качестве разделителя... - person Robin Thoni; 15.01.2020
comment
В версии докера: 19.03.9 даже ADD --chown=user:group или UID:GID работают хорошо. - person Sat93; 17.06.2020
comment
Как бы то ни было, user.group раньше был обычным явлением. Я не могу дать вам ссылку, но я думаю, что это могло быть использовано в YP Sun. Как бы то ни было, обычный формат в какой-то момент изменился с user.group на user:group, но природа этих вещей такова, что часто работают оба формата, поэтому неудивительно, что кто-то, кто уже давно работает, может быть обманут. - person Doctor Eval; 15.02.2021

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

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

Сценарий setpermissions устанавливает права пользователя:

#!/bin/bash

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

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

person Christian Metzler    schedule 06.03.2015
comment
Это то же самое, что у вас было раньше. Вы должны рассмотреть возможность принятия другого ответа как правильного. Он использует для этого официальный флаг докера без скриптов. - person Andras Gyomrey; 03.03.2018
comment
Пожалуйста, подумайте о том, чтобы принять другой ответ, чтобы помочь другим людям! Кроме того, вы, вероятно, должны просто сделать RUN <fullpath_of_setpermissions.sh> в своем Dockerfile - person Vassilis; 27.11.2020