Как стать автором
Обновить

Комментарии 18

Как гарантировать, что пользователь с UID=${UID} не имеет никаких прав на хостовой машине?

Присвоить ему UID пользователя, которого нет на хостовой машине. Например 10000. И GID такой же.

Это понятно.


Допустим, на нашем сервере есть пользователь с UID 10000, у которого есть какие-то права, но я не знаю о факте существовании такого пользователя.


Можно ли вообще гарантировать, что на любой машине, где будет использоваться этот образ, будет отсутствовать пользователь с некоторым UID/GID?

Можно ли вообще гарантировать, что на любой машине, где будет использоваться этот образ, будет отсутствовать пользователь с некоторым UID/GID?

Для любой машины вряд ли. По крайней мере мне о таком способе неизвестно.
Создание пользователей должно происходить при построении образа. Это же касается и определения пользователя, из-под которого запускаются процессы. Значит, что мы каким-то образом должны передать внутрь контейнера UID (GID).

Неоднозначно как-то. На этапе построения образа контейнера нет (билд-контейнеры не рассматриваем), а частая задача: есть образ с каким-то пользователем, надо запустить контейнер, обеспечив связь с пользователем хоста.


P.S. А вообще думал пост будет про https://docs.docker.com/engine/security/userns-remap/ и ко.

Можете дополнить статью информацией о применении gosu, и об обязательных переменных типа таких:

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 других извращенческих методов
ENTRYPOINT это не автозапуск, я говорю об автозапуске в классическом его понимании. Автозапуск нужен для промежуточного образа в котором будет окружение для выполнения программ, и на основе его будет собираться контейнер каждый со своей программой. Так что ENTRYPOINT будет занят.
Так нужен запуск какой-то программы в рантайме перед запуском основной?
не до конца понятно. но опять попробую угадать.
Может речь идет о многоуровневых билдах multi-stage builds?
Перед созданием конечного образа, запускается промежуточный контейнер в котором запускается какаято магия, подготавливающая чтото для конечного образа.
Все намного проще, нужен образ с окружением Wine для запуска windows приложений. Что бы для каждого сервиса не собирать свой wine проще его собрать в одном образе, а потом на его основе делать контейнеры подкидывая нужное ПО через copy. Автозапуск нужен для фейковых иксов.
VolCh, это ответ и на вас вопрос тоже.
  1. Соберите базовый образ.
  2. Протэгайте его.
  3. Собирайте новые образы из этого базового образа.

Протэганный образ можно либо залить на docker registry, а можно и не заливать.
А еще можно почитать ветку сначала и понять что нужен автозапуск иксов в промежуточном образе т.к. в конечном Entrypoint будет занят полезным сервисом.

Фраза "запуск в образе" не имеет смысла, запуск всегда в контейнере.


А в целом, делаете ENTRYPOINT типа entrypoint.sh


xserver -d // или как там иксы запускаются, лет 10 не трогал
program

а в дочернем образе в докерфайле делайте что-то вроде


RUN ln -s /path/to/program program


ну или другую сотню вариаций на эту тему

Я конечно может и не прав, но RUN и CMD выполняются 1(!) раз при создании контейнера. А ENTRYPOINT затирается если в родительском образе он был. Запуск должен быть прописан внутри самого контейнера, но там все настолько кастрированно, что моих знаний линукс не хватает что бы его реализовать.
Запуск и иксов, и основной программы (отсутствующей, ну или true) в ENTRYPOINT-скрипте родительского образа. В дочерних же через RUN создаётся симлинк на основную программу.

Смысл идеи в терминах ООП — в базовом образе создаём абстрактный (или с бессмысленной бесполезной реализацией) «метод» в «классе» ентрипоинт или кмд, наряду с нужной инициализацией, а в потомках этот «метод» переопределяем.
Спасибо за совет, возможно это сработает, попробую. Просто очень хотелось отделить вайн от работающего сервиса максимально «красиво». :)
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.