bash Заполнение TAB не работает на centos 8 - PullRequest
0 голосов
/ 27 марта 2020

Я запускаю дистрибутив centos 8 на docker и хотел бы, чтобы bash TAB завершила работу с dnf менеджером пакетов. Согласно другим сообщениям, я сделал следующее после запуска моего docker контейнера:

dnf clean all && rm -r /var/cache/dnf && dnf upgrade -y && dnf update -y

, а затем

dnf install bash-completion sqlite -y

После этого я перезапускаю контейнер, но все еще нет bash завершение. Я также попытался напрямую получить файл завершения bash, выполнив:

source /etc/profile.d/bash_completion.sh

, но без какого-либо лучшего эффекта.

Знаете ли вы, что я делаю неправильно?

1 Ответ

1 голос
/ 28 марта 2020

Вам не нужно BASH Завершение в Docker контейнере. Единственное время, когда вам нужно вручную подключаться к оболочке внутри контейнера Linux, - это выяснить, почему процесс, выполняющийся в контейнере, работает ненормально. На самом деле, некоторые рекомендации по дизайну контейнера могут даже go предлагать вам вообще не включать оболочку в базовую ОС!

Причина, по которой это не работает для вас, заключается в том, как Linux контейнеры работают. Контейнер - это просто пространство имен , которое управляется ядром, установленным в ОС хоста. Этот процесс не может быть изменен или прерван, или контейнер будет уничтожен, так как процесс будет отправлен SIGTERM . Когда вы пытаетесь source сценарий bash_completion.sh, вы пытаетесь передать новые аргументы конфигурации в существующий процесс с пространством имен, управляемый Docker.

Если вы действительно хотите сделать это, лучший способ сделать это - создать новое Docker изображение контейнера на основе исходного базового образа CentOS 8. Затем установите пакет завершения bash и добавьте команду echo, чтобы добавить исходную строку в файл .bashrc вашего пользователя.

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

Что касается дополнительного вопроса, заданного OP в комментариях к этому ответу, я добавил ниже дополнительную информацию.

Почему мне не нужно заполнять bash в контейнере

Причина, по которой вам не нужно завершение bash в контейнере, заключается в том, что контейнеры не предназначены для присоединения с помощью оболочки. Предполагается, что A - это единственный экземпляр процесса, выполняемого по заданным c настроенным критериям. Контейнеры не предназначены для создания сред разработки, к которым вы можете подключаться, они предназначены для запуска процессов и приложений в программной инфраструктуре.

Обновление и установка пакетов вручную

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

Не могу поверить, что это невозможно

Это возможно, если вы создадите новый Dockerfile, который намеренно устанавливает его на новый слой базы изображение и создает новое изображение контейнера для использования. НО дело в том, что вы не должны подключаться к Docker контейнерам в первую очередь, чтобы даже добраться до точки, где вам может понадобиться что-то вроде bash завершение!

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

...