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>. Более подробную информацию см. в ссылке ниже.

Ссылка:

  1. захват

Я копирую файлы во временный каталог (например, g: /tmp/) чем пользуетесь RUN cp копировать их всякий раз, когда я хочу их.

COPY myfile /tmp/
RUN cp -r /tmp/myfile /target/path/
Другие вопросы по тегам