2015-08-12 5 views
3

Предположим, у меня есть контейнер Docker, в котором хранятся некоторые данные. Я хочу, чтобы эти данные сохранялись - если контейнер остановлен, удален, обновлен и т. Д. Я все же хочу, чтобы данные находились в доступном месте в файловой системе ОС хоста.Какие разрешения необходимы для работы томов Docker?

В настоящее время мое решение заключается в создании каталога /srv/service-name на моем хосте (я использую Ubuntu 14.10), а затем запускаю свою службу с аргументом -v /srv/service-name:/path/inside/container.

В результате проб и ошибок я обнаружил, что иногда контейнер не может писать на него, поскольку он не имеет прав доступа. Я нашел this question, где в качестве решения приведены контейнеры только для данных. Ну, я не хочу использовать контейнеры, потому что это кажется излишне сложным для того, что я делаю. Я предпочел бы просто монтировать каталоги с помощью -v.

Итак, как я могу установить правильные разрешения в каталоге, который я монтирую?

ответ

4

Итак, как я могу установить правильные разрешения в каталоге, который я монтирую?

Нет ничего особенного в томах Docker: для того, чтобы процесс записывался в каталог, право собственности и разрешения на этот каталог должны позволять писать.

По умолчанию процессы в контейнере Docker работают как root и могут писать практически везде, без дополнительных ограничений, накладываемых чем-то вроде selinux.

Если у вас есть процесс в контейнере , а не, работающий от имени пользователя root, вам необходимо убедиться, что все тома, которые вы открываете в контейнер, имеют право собственности. У вас есть в основном два варианта:

  1. Установите разрешения на исходную директорию с хоста.

    Если ваш процесс запущен как пользователь httpd внутри контейнера, вам нужно будет определить числовой UID, связанный с этим пользователем, а затем chown каталог с соответствующим идентификатором пользователя. Например, если пользователь httpd внутри контейнера UID 48, а затем на хосте:

    chown 48 /srv/webserver 
    

    Как вы, вероятно, ожидать, это означает, что запуск ls -l на хосте может возвращать другое имя, потому что нет никакой гарантии, что UIDs в идентификаторе UID контейнера на хосте.

  2. Установка разрешений в качестве ENTRYPOINT сценария

    Если вы создаете свои собственные изображения, вы можете запустить контейнеры, как root, а затем иметь ENTRYPOINT скрипт, который отвечает за (а) установление права собственности и разрешений, а затем (б) переключение на непривилегированного пользователя для запуска CMD.

+0

Этот ответ должен быть отмечен как хороший, помогите мне, спасибо. –

Смежные вопросы