Я запускаю chromedriver + chrome внутри Docker в своей тестовой среде.
Все работало нормально до последнего обновления CoreOS.
Вот версии, которые кажутся работающими:
VERSION=1185.5.0
VERSION_ID=1185.5.0
BUILD_ID=2016-12-07-0937
И это более новая версия, которая заставляет хром загружать ядра:
VERSION=1235.4.0
VERSION_ID=1235.4.0
BUILD_ID=2017-01-04-0450
Глядя на изменения, кажется, что докер был обновлен с 1.11.x до 1.12.x, что сломало setns()
вызов внутри контейнера. setns()
используется Chrome для создания пространств имен.
Это примеры выходов:
jsosic-coreos-test-20161207 ~ # docker --version
Docker version 1.11.2, build bac3bae
Изнутри одного контейнера на этом ящике:
[root@2939f21ecfaa /]# /opt/google/chrome/google-chrome
[57:57:0107/015130:ERROR:browser_main_loop.cc(261)] Gtk: cannot open display:
Вот как это сломала новая версия:
jsosic-coreos-test-2017-01-04 ~ # docker --version
Docker version 1.12.3, build 34a2ead
[root@13ab34c36c82 /]# /opt/google/chrome/chrome
Failed to move to new namespace: PID namespaces supported,
Network namespace supported,
but failed: errno = Operation not permitted
Aborted (core dumped)
Я обнаружил, что если я запустил контейнер с --cap-add=SYS_ADMIN
или --privileged
- Chrome работает как положено.
В чем разница между этими двумя переключателями? Какие возможности включены --privileged
?
И могу ли я позволить setns()
внутри контейнера без ущерба для безопасности?
AFAICS, документация предлагает предоставление возможностей, необходимых для контейнера, вместо использования --privileged
переключатель. Запуск в привилегированном режиме кажется, дает контейнер все возможности (какие именно они указаны в первом URL-адресе, при условии, что документы актуальны).
Короче, я бы сказал, что --cap-add=SYS_ADMIN
предоставляет контейнеру меньший набор возможностей по сравнению с --privileged
переключатель. В примерах в документации Docker (первый URL-адрес), похоже, предпочитают просто добавлять SYS_ADMIN
или NET_ADMIN
возможность там, где это необходимо.
Одно отличие состоит в том, что --privileged монтирует / dev и / sys как RW, тогда как SYS_ADMIN монтирует их как RO. Это означает, что привилегированный контейнер имеет полный доступ к устройствам в системе. SYS_ADMIN не дает вам этого.