2016-03-31 5 views
0

Запуск моего приложения, как показано ниже:Как предоставить MLOCK системный вызов к контейнеру вызывается через «SUDO РКТ перспективе» на CoreOs

sudo rkt run --insecure-options=image --interactive --net=host ./myapp.aci

Я получаю сообщение:

Не удалось блокировка памяти: не может выделить память

Которая после некоторого рытья показала бы, что в контейнере нет CAP_IPC_LOCK. Я вникнул в некоторые из документации, но не могу найти, где мне нужно добавить конфигурацию или любой вариант, чтобы включить это. Как мне это сделать?

ответ

2

ACI могут указывать, какие колпачки им нужны в своем манифесте с помощью isolator of type os/linux/capabilities-retain-set.

Чтобы проверить, если манифест содержит такой разъединитель, вы можете использовать actool:

$ actool cat-manifest --pretty-print ./myapp.aci 

Вы можете увидеть следующее:

"isolators": [ 
     { 
      "name": "os/linux/capabilities-retain-set", 
      "value": { 
       "set": [ 
        "CAP_IPC_LOCK" 
       ] 
      } 
     } 
    ] 

Чтобы добавить CAP_IPC_LOCK, вы можете использовать:

$ actool patch-manifest --capability=CAP_IPC_LOCK --replace ./myapp.aci 

В настоящее время невозможно добавить возможность непосредственно на rkt run командной строки. Я задал вопрос о GitHub для этого запроса функции: coreos/rkt#2371

+0

Спасибо, я пришел к выводу, близко к этому, но думал, что я хотел бы дать кому-то шанс, чтобы ответить на него. Я раньше не знал о функции patch-manifest, я создал свой процесс сборки ACI, чтобы изменить его с помощью jq, спасибо! Я также нашел, что для этого я также должен был разблокировать ACI, использовать «setcap cap_ipc_lock = + ep» в исполняемом файле, а затем воссоздать ACI с помощью bsdtar, чтобы возможности исполняемого файла сохранялись, поскольку копия сборки не сохранялась эти атрибуты в начальном ACI. Добавьте это в свой ответ для полноты или предоставите альтернативу, и я соглашусь с ней. – Benjamin

2

Вы можете использовать acbuild, чтобы дать вашему контейнеру нужные возможности.

Если вы уже используете acbuild, чтобы сделать ваш ACI, просто добавьте эту строку в сценарий сборки:

echo '{ "set": ["CAP_IPC_LOCK"] }' | acbuild isolator add "os/linux/capabilities-retain-set" -

Или, если вы не используете acbuild, чтобы сделать ваш ACI, вы можете изменить существующий ACI, используя флаг --modify. Таким образом, команда будет:

echo '{ "set": ["CAP_IPC_LOCK"] }' | acbuild --modify path/to/your/app.aci isolator add "os/linux/capabilities-retain-set" -

+0

Полезно знать, что я могу это сделать, используя acbuild. Более подробную информацию о том, можно ли сохранить статус «setcap cap_ipc_lock = + ep» в исполняемом файле в архиве любым другим способом, чем путем депакетирования/настройки/переупаковки через bsdtar в соответствии с моим комментарием к другому ответу? – Benjamin

+1

Если в ACI есть двоичный файл 'setcap', вы можете запустить его с' acbuild run', но если нет, то я думаю, что единственный способ сделать это - путь bsdtar. –

+0

Спасибо, увидим, есть ли проблема против acbuild для сохранения флагов шапки на 'copy', а если нет, откройте его. Я собираюсь присудить ответ @Alban, поскольку этот ответ был первым в настройке изолятора. – Benjamin