
Alexey
17.05.2017
10:19:03
Привет всем. Подскажите, кто-то сталкивался с проблемами докера при попытке запускать процессы в контейнерах не от рута? Проблема в том, что моему приложению нужно писать лог в /var/log/myapp, а этот каталог монтируется на хост, но монитрование делает рут, соответственно каталог принадлежит теперь руту. Таких каталогов у меня несколько. В итоге начинается пляска с chown и entrypoint скриптами, а после смены владельца меняется владелец каталога на хосте...
Если я меняю владельца каталога внутри контейнера, то меняется владелец каталога на хосте... Сейчас точно не помню, кто становится владельцем, вроде netdev юзер...

Bogdan (SirEdvin)
17.05.2017
10:29:43

Artem
17.05.2017
10:30:37

Google

Artem
17.05.2017
10:30:57
а зачем вам на хосте сохранять другие права если все контейнеры в этот маунт могут писать?
с теми правами которые выставились из контейнера, при учете запуска аппов с одного типа образов

Alexey
17.05.2017
10:51:27

Artem
17.05.2017
10:51:52
ну да
главное что из контейнеров они доступны

Anton
17.05.2017
10:52:55

Artem
17.05.2017
10:53:11
т.к. присвоив права username на хосте, из контейнера они вряд ли будут иметь владельца username, в скорее всего какой нибудь системный юзер либо вообще id 1001 например

Alexey
17.05.2017
10:53:27

Artem
17.05.2017
10:53:57
просто один раз изнутри контейнера сделать chown на правильного юзера
и дальше эти права остануться на этом маунте на хосте

Alexey
17.05.2017
10:55:41

Artem
17.05.2017
10:56:01
в компоузе ты маунтишь каталог
а в докерфайле засовываешь содержимое его при сборке образа

Google

Artem
17.05.2017
10:57:07
когда маунтишь из компоузе он маунтится поверх текущего присутствующего каталога не затрагивая при этом то что было в изначальном каталоге
так что через докерфайл это впринципе не монтирование

Alexey
17.05.2017
10:58:48

Artem
17.05.2017
10:59:19
да
только если ты монтируешь в компоузе, то зачем вообще до этого засовывать тоже самое при сборке образа?
ты либо монтируешь с хоста, либо держишь код в образе
одно другое перекрывает

Alexey
17.05.2017
11:00:51
Поэтому на этапе сборки я полюбому должен определить права, либо это нужно делать через compose

Artem
17.05.2017
11:01:25
ну так статичный код тогда вшиваешь в образ при сборке в докерфайле, а папку с данными маунтишь с хоста
права можно указать и без скрипта на этапе сборки в докерфайле
RUN chown ....
но это никак не связано с докерфайлом, т.к. маунту срать на права которые стояли на папке вместо которой его подмонтировали

Alexey
17.05.2017
11:04:27

Artem
17.05.2017
11:04:44
ну у тебя маунт же один и тот же?
если папка на хосте которая монтируется одна и та же, то это нужно всего один раз чтобы выставить права из контейнера
дальнейшие маунты будут с теми же правами в этих образах

Alexey
17.05.2017
11:06:32

Artem
17.05.2017
11:06:57
в аналогичном образе на базе которого ты собираешь одни и те же id юзеров

Google

Artem
17.05.2017
11:07:13
а права остаются на хочте

Alexey
17.05.2017
11:07:59
Понял.

Artem
17.05.2017
11:08:12
к примеру у меня есть папка которая монтируется в /var/lib/mysql и владельцем внутри контейнера mysql:mysql
а на хосте она отображается с такими правами
drwxr-xr-x 12 systemd-bus-proxy ssh_keys 4096 май 5 10:16 data
и любой образ на базе стандартного mysql образа будет с правильными правами ее видеть если примонтирую к нему

Alexey
17.05.2017
11:09:41

Artem
17.05.2017
11:11:26
м?

Alexey
17.05.2017
11:12:58
Основная проблема с правами внутри контейнера. Каталоги разбросаны по системе /var/log/myapp /opt/myapp /home/user/myapp может мне все, что связано с приложением хранить в $HOME ? И не нужно будет с chown возиться. С точки зрения практики, насколько это корректно?

Artem
17.05.2017
11:15:09
можно и так, это не принципиально, контейнер != вм
поэтому в плане безопасности никаких проблем не должно быть, можно хоть в корне хранить
вообще лучше бы аппу работать от рута
тогда не будет проблем с правами

Alexey
17.05.2017
11:16:30

Artem
17.05.2017
11:16:51
рут в контейнере != рут доступу к хосту
по правильному там только один процесс аппликейшена должен работать и все
а данные можно будет хранить тогда /app /data /log
если ваш пользователь имеет доступ к маунту с хоста (т.к. выставлены права из контейнера) то это было бы аналогично если бы апп работал от рута и так же имел те же доступы
только без гемороя со сменой прав

Alexey
17.05.2017
11:19:29
К сожалению, есть такая штука liquidsoap, не удается запустить ее от рута :)

Artem
17.05.2017
11:20:11
ну если уже ограничения аппы, то да деваться некуда, тоже самое как и с mysql из под рута запускать геморойно в контейнере

Alex
17.05.2017
11:20:44
Ребят, а если я хочу запускать контейнер с базой из systemd при старте

Google

Alex
17.05.2017
11:21:07
мне в секцию Service что корректно писать ? Restart=no ?
и можно ли ExecStart ууказать как /usr/bin/docker start container-name ?

Artem
17.05.2017
11:21:27
а зачем еще системд в контейнере?
сама база не может демоном висеть?

Alex
17.05.2017
11:21:39
не в контейнере на хосте

Artem
17.05.2017
11:21:46
аа

Alex
17.05.2017
11:21:51
мне надо после ребута поднять контейнер.

Artem
17.05.2017
11:22:26
так докер в автозагрузку и контейнеры в restart always может?

Alex
17.05.2017
11:22:40
докер в автозагрузке

Admin
ERROR: S client not available

Alex
17.05.2017
11:22:49
он тогда постоянно ребутиться

Artem
17.05.2017
11:23:42
если с контейнером все норм и он не выпадает с ошибкой то при restart=always он вроде как запускает те контейнеры которые работали до перезагрузки
а если он рестартит постоянно, то значит контейнер выпал с ошибкой какой то и ручной запуск его так же не поднимет

Alexey
17.05.2017
11:24:39

Artem
17.05.2017
11:25:17
обычно через стейт это можно увидеть и покурить почему в docker logs

Alex
17.05.2017
11:25:30
приложение в контейнере не вылетает. Если запускать ручками всё ок.
в логах нормальный старт постгреса.

Artem
17.05.2017
11:26:33
так рестарт будет только если стейт будет не running
точнее UP

Alexey
17.05.2017
11:27:46

Google

Alex
17.05.2017
11:28:21
docker start container-name

Alexey
17.05.2017
11:29:28
и контейнера остается запущенным\?
А если сделаете ребут, то контейнер бесконечно рестартится?

Alex
17.05.2017
11:30:10
да
что значит ребут ?
бесконечно рестартиться если я его через systemd запускаю

Alexey
17.05.2017
11:30:38
Ну, перезагрузка. Вам же автостарт нужен?

Alex
17.05.2017
11:30:45
systemctl start docker-db.service
да

Alexey
17.05.2017
11:32:46
А вы доки читали? Просто я пока не сталкивался с этим в своих задачах
https://docs.docker.com/engine/admin/host_integration/

Alex
17.05.2017
11:33:19
Читал.

Konstantin
17.05.2017
11:33:53

Alex
17.05.2017
11:34:17
вот!
а как ему сказать какие контейнеры надо запускать а какие нет ? :)

Konstantin
17.05.2017
11:34:44
Запускай с флагом restart=always
Выше тебе сазали

Alex
17.05.2017
11:35:19
контейнер ребутиться каждые 10 секунд при этом.

Konstantin
17.05.2017
11:35:23
Это и есть флаг "аатозагрузки"
Он не за этого перезапускается, 200%

Alex
17.05.2017
11:35:59
почему тогда не перезапускается когда ручками запускаешь ?
и когда был upstart не перезапускался тоже ?