2016-11-16 1 views
-4

У меня есть каталог, например /demoenv. Я хотел бы запустить в нем двоичный файл как контейнер докеров.Как запустить chrooted каталог в качестве контейнера докера?

По существу, он будет работать как chroot, но с многочисленными дополнительными функциями (и с многочисленными недостатками), что обеспечивает контейнер докеров.

В этом случае это абсолютно не проблема, если он не может принять участие в очень полезном механизме фиксации изображения/контейнера докеров (для этого у меня есть альтернативное решение).

Могу ли я как-нибудь это сделать?

  • Моя первая проблема в том, что в этом случае у меня действительно нет изображения для начала.
  • Моей вторая проблема заключается в том, что -v объем варианта (параметр docker run) запрещает монтирование корневого раздела со следующим сообщением установки:

docker: Error response from daemon: Invalid bind mount spec "/demoenv:/": Invalid specification: destination can't be '/' in '/demoenv:/'.

+0

Наконец-то я нашел обходное решение: я просто монтирую все корневые каталоги с помощью '-v'. Но это очень грязно. :-( – peterh

+0

Вы можете, конечно, просто создать изображение докеры из файловой системы, а затем запустить изображение докера в качестве контейнера. В качестве альтернативы вы можете использовать что-то вроде 'systemd-nspawn', которое дает вам множество функций, которые можно ожидать от Docker с точки зрения изоляции, в то время как легко работает с существующими каталогами. – larsks

+0

@larsks 1) Мне нужен докер, потому что я демонстрационирую контейнер докера 2) сделать копию нехорошо, потому что она большая, и мне нужно взаимодействие между хостом и контейнер на уровне fs. – peterh

ответ

0

Наконец я нашел обходной путь.

К сожалению, просто монтаж «/» (либо с VOLUME команды в Dockerfile, или давая -v к docker run) не работает - она ​​не может смонтировать корневой каталог в качестве тома.

Furhtermore, VOLUME в Dockerfile, похоже, не работает вообще.

Лучшее (или, что хуже) решение, что можно сделать: установка подкаталогов в виде разных томов. Вокруг так:

docker run -d -h demobox --name demobox \ 
    -v /demobox/bin:/bin \ 
    -v /demobox/boot:/boot \ 
    -v /demobox/etc:/etc \ 
    -v /demobox/home:/home \ 
    -v /demobox/lib:/lib \ 
    -v /demobox/opt:/opt\ 
    -v /demobox/root:/root\ 
    -v /demobox/sbin:/sbin\ 
    -v /demobox/srv:/srv\ 
    -v /demobox/usr:/usr\ 
    -v /demobox/var:/var \ 
    demobox 

К сожалению, он также должен иметь фальшивый образ для запуска (это «подделка», потому что все его соответствующих /* каталогов будет чрезмерно смонтирован докер демон). Вы можете использовать что-нибудь для этого (я использовал образ распределения по умолчанию).

Дополнительная информация: в качестве точки входа мы также можем предоставить /sbin/init контейнеру. В моих попытках systemd не смог запустить в нем, но upstart мог (apt-get install upstart). Предоставляя /sbin/init как ENTRYPOINT до Dockerfile, а затем, после запуска контейнера telinit 3, мы можем по существу запустить контейнер докеров в качестве виртуального сервера.

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