Поделитесь сокетом докера, используя пространства имен пользователей

Можно ли использовать сокет докера, смонтированный с хоста внутри контейнера докера, при использовании пространств имен пользователей?

У меня есть следующая конфигурация:

/etc/subuid

 user:100000:65536

/etc/субгид

 user:100000:65536

/etc/докер/daemon.json

{                              
  "userns-remap": "ns-user" 
}

Я создал пользователя ns-user с UID 100000 и группу ns-user с GID 100000. Дополнительно Я добавил ns-user в группу docker. Когда я вхожу в систему как ns-user на хост-компьютере, я могу использовать докер через сокет.

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

srw-rw---- 1 nobody nogroup 0 Jun 26 15:00 /var/run/docker.sock

РЕДАКТИРОВАТЬ 1:

Чтобы уточнить, я думал, что корень (uid 0) внутри контейнера сопоставляется с ns-user (uid 100000) на хосте, у которого есть разрешение на сокет докера. но на самом деле мне отказывают в разрешении. Почему?

Я не хочу использовать параметр --userns=host.


person lbednaszynski    schedule 26.06.2017    source источник
comment
как вы запускаете команду запуска докера? вы устанавливаете -v /var/run/docker.sock:/var/run/docker.sock ??   -  person OscarAkaElvis    schedule 26.06.2017
comment
docker run --rm -it --entrypoint bash -v /var/run/docker.sock:/var/run/docker.sock myimage, где мой образ имеет связанный клиент docker   -  person lbednaszynski    schedule 26.06.2017
comment
Прямо сейчас я решил это, подключившись через HTTP вместо использования сокета. Я настроил демон Docker для привязки только к интерфейсу Docker Bridge. Но вопрос все еще открыт. Можно ли это сделать с помощью сокета?   -  person lbednaszynski    schedule 29.06.2017


Ответы (1)


Вы можете сделать это, используя socat для создания сокета с правильными привилегиями для пользователя пространства имен:

sudo socat UNIX-LISTEN:/var/run/docker-userns.sock,user=1000,group=1000,mode=0600,fork UNIX-CLIENT:/var/run/docker.sock &

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

Я искал что-то более настраиваемое, чем это. Вероятно, можно использовать скрипт python с модулем pty, как указано здесь.

person Routhinator    schedule 09.12.2018