Comments 18
Как гарантировать, что пользователь с UID=${UID}
не имеет никаких прав на хостовой машине?
Это понятно.
Допустим, на нашем сервере есть пользователь с UID 10000, у которого есть какие-то права, но я не знаю о факте существовании такого пользователя.
Можно ли вообще гарантировать, что на любой машине, где будет использоваться этот образ, будет отсутствовать пользователь с некоторым UID/GID?
Создание пользователей должно происходить при построении образа. Это же касается и определения пользователя, из-под которого запускаются процессы. Значит, что мы каким-то образом должны передать внутрь контейнера UID (GID).
Неоднозначно как-то. На этапе построения образа контейнера нет (билд-контейнеры не рассматриваем), а частая задача: есть образ с каким-то пользователем, надо запустить контейнер, обеспечив связь с пользователем хоста.
P.S. А вообще думал пост будет про https://docs.docker.com/engine/security/userns-remap/ и ко.
version: "3"
services:
app:
image: repo/app:v1
user: "${UID:?Please export UID}:${GID:?Please export GID}"
volumes:
- "vol1:/data/vol1:rw"
- "vol2:/data/vol2:ro"
ports:
- "8080:8080"
- используешь ENTRYPOINT или CMD что бы запустить свою команду при запуске контейнера.
- если надо что-то навороченное, тогда заворачиваешь все это в самописный script.sh и передаешь его в ENTRYPOINT или CMD
- можно пойти дальше и использовать github.com/krallin/tini
- или github.com/Yelp/dumb-init
- или наверное еще 100500 других извращенческих методов
Может речь идет о многоуровневых билдах multi-stage builds?
Перед созданием конечного образа, запускается промежуточный контейнер в котором запускается какаято магия, подготавливающая чтото для конечного образа.
VolCh, это ответ и на вас вопрос тоже.
- Соберите базовый образ.
- Протэгайте его.
- Собирайте новые образы из этого базового образа.
Протэганный образ можно либо залить на docker registry, а можно и не заливать.
Фраза "запуск в образе" не имеет смысла, запуск всегда в контейнере.
А в целом, делаете ENTRYPOINT типа entrypoint.sh
xserver -d // или как там иксы запускаются, лет 10 не трогал
program
а в дочернем образе в докерфайле делайте что-то вроде
RUN ln -s /path/to/program program
ну или другую сотню вариаций на эту тему
Смысл идеи в терминах ООП — в базовом образе создаём абстрактный (или с бессмысленной бесполезной реализацией) «метод» в «классе» ентрипоинт или кмд, наряду с нужной инициализацией, а в потомках этот «метод» переопределяем.
Пользователь в Docker