Завершение bash TAB не работает на Centos 8

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

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

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

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


person Eurydice    schedule 27.03.2020    source источник


Ответы (1)


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

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

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

ИЗМЕНИТЬ:

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

Почему мне не нужно завершение bash в контейнере

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

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

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

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

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

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

person TJ Zimmerman    schedule 28.03.2020
comment
Мне жаль, но я не понимаю вашей точки зрения. Может быть, я неправильно понял. Почему мне не нужно завершение bash в контейнере? Первое, что мы обычно делаем при запуске контейнера, это 1) обновление пакетов 2) установка некоторых пакетов. Итак, для пункта 2) крайне необходимо завершение табуляции. Именно по этой причине я не могу поверить, что это невозможно. - person Eurydice; 28.03.2020
comment
Я добавил дополнительную информацию к своему ответу в разделе внизу под названием EDIT. Фундаментальное непонимание, которое у вас есть, заключается в том, как должны использоваться контейнеры Docker. После того, как спецификация контейнера определена и контейнер создан, вы никогда не должны подключаться к нему, если вам не нужно устранять неполадки с приложением, работающим внутри него. Получение доступа к оболочке в контейнере происходит редко. Настолько, что странно хотеть установить внутри него дополнение bash. Я профессионально работаю с этим материалом и могу запускать контейнер максимум раз в две недели. - person TJ Zimmerman; 28.03.2020
comment
в порядке. Я понимаю вашу точку зрения и в чем-то согласен. Но я все еще думаю, что завершение bash может быть полезным. Я знаю об использовании команд RUN. Однако скажите, что вы используете дистрибутив, с которым вам не комфортно (в моем случае это Centos). Прежде чем скомпилировать набор команд RUN, которые вы добавите в свой Dockerfile, вам будет приятно покопаться в них непосредственно внутри контейнера. Например, данный пакет не имеет такого же имени в Ubuntu или Centos (например, в библиотеке NetCDF). В любом случае, спасибо за вашу помощь и пояснения. - person Eurydice; 30.03.2020