Как быть в состоянии записать в файл внутри образа докера? - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть образ докера, созданный со следующим Dockerfile

FROM ubuntu

RUN useradd -ms /bin/bash seltest
RUN mkdir /home/seltest/output
RUN touch /home/seltest/output/test.out
WORKDIR /home/seltest
RUN chown -R seltest:seltest .
COPY script.sh /home/seltest
USER seltest

CMD ["bash", "script.sh"]

, который по существу создает нового пользователя seltest, а затем выполнил скрипт script.sh:

echo 'test' > /home/seltest/output/test.out

Я создаю образ докера с помощью следующей команды

docker build -f Dockerfile -t testimage  .

и запускаю его на хосте с помощью следующей команды:

docker run --rm  -it  -v ${PWD}/output:/home/seltest/output testimage

, но получаю ошибку

script.sh: line 1: /home/seltest/output/test.out: Permission denied

Локальная папка, которую я предварительно создал с именем output, пуста.

Почему я получаю эту ошибку?Как настроить общую папку, в которую пользователь docker seltest может писать?Что я тут не так делаю?

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Я изменил ваш докер-файл на приведенный ниже

FROM ubuntu

RUN useradd -ms /bin/bash seltest
RUN mkdir /home/seltest/output
RUN touch /home/seltest/output/test.out
WORKDIR /home/seltest
COPY script.sh /home/seltest
RUN chmod +x /home/seltest/script.sh
RUN chown -R seltest:seltest .
USER seltest

CMD ["bash", "script.sh"]

Что я сделал?

Установите копию скрипта, прежде чем сменить владельца домашнего субсодержания. Это поможет избежать проблем с правами доступа в скрипте.

В разрешении по-прежнему отказано После этого у вас по-прежнему будет проблема «Отказано в доступе» при выполнении

docker run --rm  -it  -v ${PWD}/output:/home/seltest/output testimage

Причина и возможное решение

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

  1. Give chmod 643 $ {PWD} / output
  2. Создайте пользователя в хост-системе, а затем создайте пользователя внутри контейнера с тем же UID
  3. Предоставьте пользователю, имеющему UID 1000, в вашей хост-системе доступ на запись в папку: RUN useradd -u $ {UID} -ms / bin / bash seltest
  4. Используйте пользователя nobody в контейнере и установите права группы из папки хоста никому. Установка прав на хосте может быть выполнена с помощью jenkins или с помощью образа подготовки докера, который запускается, меняет группу, завершает работу
1 голос
/ 04 апреля 2019

Вы монтируете /home/seltest/output/ из своей хост-ОС, поэтому у него есть разрешения и право владения из хост-ОС. Сделайте его доступным для записи всем, и у вас не будет проблем в контейнере:

$ chmod 777 ${PWD}/output
$ docker run --rm  -it  -v ${PWD}/output:/home/seltest/output testimage

Конечно, более безопасный вариант будет, когда вы настроите разрешение на запись с большей степенью детализации, а не на запись для всех. Это может быть проблемой, поскольку пользователь seltest существует только в контейнере. Лучшим вариантом будет, если вы определите также идентификатор пользователя, когда создаете seltest пользователя, так что вы сможете разрешить запись для этого идентификатора пользователя на уровне каталога ${PWD}/output.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...