Отсоединить контейнер от хост-консоли - PullRequest
1 голос
/ 12 апреля 2019

Я создаю Docker-контейнер с образом Ubuntu: 16.04, используя пакет Python Docker.Я передаю tty как True и отсоединяю как True к функции client.containers.run ().Контейнер начинается с / sbin / init процесса.Контейнер успешно создан.Но проблема в том, что приглашение на вход в систему на моем хост-компьютере заменяется приглашением на вход в контейнер на консоли моего хост-компьютера.В результате я не могу войти в систему на машине на консоли.SSH-подключение к машине работает нормально.

Это происходит, даже когда я запускаю свой скрипт на python после подключения SSH к машине.Я пробовал разные варианты, такие как установка tty в False, установка stdout в False, установка переменной среды TERM для xterm в контейнере, но ничего не помогло.

Было бы очень здорово, если бы кто-то мог предложить решение этой проблемы.

Мой сценарий очень прост:

import docker
client = docker.from_env()

container = client.containers.run('ubuntu:16.04', '/sbin/init', privileged=True,
       detach=True, tty=True, stdin_open=True, stdout=False, stderr=False,
       environment=['TERM=xterm'])

Я не использую никакой файл Docker.

Мне удалось выяснить, что эта проблема возникает при запуске контейнерав привилегированном режиме.Если я сделаю это, процесс / sbin / init запустит процессы / sbin / agetty, что приведет к подключению / dev / tty к контейнеру.Мне нужно найти способ запустить / sbin / init так, чтобы он не создавал процессы / sbin / agetty.

1 Ответ

2 голосов
/ 12 апреля 2019

/sbin/init в Ubuntu это сервис под названием systemd . Если вы посмотрите на связанную страницу, она делает кучу вещей - настраивает различные параметры ядра, монтирует файловые системы, настраивает сеть, запускает процесс getty, .... Многие из этих вещей требуют изменения глобальных настроек хоста, и если вы запустите контейнер с --privileged, который вы позволяете systemd сделать это.

Я бы дал две ключевые рекомендации по этой команде:

Не запускайте systemd в Docker. Если вам действительно нужна многопроцессорная система инициализации, supervisord популярен, но предпочитает однопроцессные контейнеры. Если вы знаете, что вам нужен init (8) (у процесса ID 1 есть некоторые обязанности), тогда tini - еще один популярный вариант.

Не запускайте напрямую дистрибутивные образы Linux. Независимо от того, какое программное обеспечение вы пытаетесь запустить, оно почти наверняка не входит в образ alpine или ubuntu. Создайте пользовательский образ , в котором есть необходимое программное обеспечение, и запустите , который ; Вы должны правильно настроить CMD, чтобы вы могли docker run изображение без какой-либо ручной настройки.

Также помните, что возможность запуска любой команды Docker подразумевает неограниченный доступ корневого уровня через хост. Вы видите кое-что из этого, когда контейнер --privileged захватывает консоль хоста; также очень легко читать и редактировать файлы, такие как /etc/shadow и /etc/sudoers хоста. Технически нет ничего плохого в том типе сценария, который вы показываете, но вы должны быть предельно осторожны со стандартными проблемами безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...