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 пользователя контейнера перед его копированием. Но это больше похоже на взлом.
4 ответа
Я думаю, что нашел решение, которое работает. Использование контейнера с объемом данных сделает свое дело. Сначала я создаю контейнер томов данных, который содержит копию моего внешнего каталога:
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>
при запуске контейнера приложения.
--chown
флаг был наконец добавлен COPY
:
COPY --chown=patrick hostPath containerPath
Этот новый синтаксис работает в Docker 17.09.
Смотрите PR для получения дополнительной информации.
Docker Копирование и смена владельца (для контейнера Windows)
FROM mcr.microsoft.com/windows/servercore:ltsc2019
WORKDIR /src
COPY . /src
RUN takeown /F . /d Y /r
Для другого пользователя в качестве владельца добавьте/u <username>
. Более подробную информацию см. в ссылке ниже.
Ссылка:
Я копирую файлы во временный каталог (например, g: /tmp/
) чем пользуетесь RUN cp
копировать их всякий раз, когда я хочу их.
COPY myfile /tmp/
RUN cp -r /tmp/myfile /target/path/