Вам не нужно 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 завершение!
Вот отличная сводка по Разница между контейнером и виртуальной машиной, которая может помочь прояснить некоторые из них для вас. В двух словах, контейнеры должны запускать и только запускать процессы.