Вам не нужно выполнять 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