Запрос Docker bash не отображает цветную информацию

Я использую команду: docker run --rm -it govim bash -l для запуска изображений докера, но он не отображает цветной вывод. Если я использую source ~/.bash_profile или снова запускаю bash -l, вывод будет корректно выводиться с цветом.

Bash Prompt Image

Мой bash_profile и bash_prompt

Ответы

Ответ 1

OP SolomonT сообщает, что docker run с env и работает:

docker run --rm -it -e "TERM=xterm-256color" govim bash -l

И Фернандо Коррейя добавляет в комментариях:

Чтобы получить поддержку цвета и заставить работать tmux, я объединил оба примера:

docker exec -it my-container env TERM=xterm-256color script -q -c "/bin/bash" /dev/null

Как прокомментировал Чепнер (предыдущий ответ), .bash_profile поставляется (это интерактивная оболочка), так как bash_prompt вызывается .bash_profile.

Но проблема с докером 9299 иллюстрирует, что TERM, кажется, не устанавливается сразу, заставляя пользователей открывать еще один bash с:

docker exec -ti test env TERM=xterm-256color bash -l

У вас похожие проблемы с цветом 8755.

Чтобы проиллюстрировать/воспроизвести проблему:

docker exec -ti $CONTAINER_NAME tty
not a tty

Текущий обходной путь:

docker exec -ti 'your_container_id' script -q -c "/bin/bash" /dev/null

Оба предполагают, что сначала у вас есть работающий контейнер, что может быть неудобно.

Ответ 2

Добавив в VonC ответ, я сделал эту функцию bash:

drun() { # start container with the specified entrypoint and colour terminal
    if [[ $# -lt 2 ]]; then
        echo "drun needs 2+ arguments: image entrypoint" >&2
        return
    fi
    docker run -ti -e "TERM=xterm-256color" "[email protected]"
}

Ответ 3

Я думаю, что это то, что вам нужно было бы реализовать вручную. Мой контейнер имеет python, поэтому здесь, как я печатаю по цвету с помощью одной строки:

пример файла докеров:

FROM django:python3
RUN python -c "print('\033[90m   HELLO_WORLD   \033[0m')"
RUN python -c "print('\033[91m   HELLO_WORLD   \033[0m')"
RUN python -c "print('\033[92m   HELLO_WORLD   \033[0m')"
RUN python -c "print('\033[93m   HELLO_WORLD   \033[0m')"
RUN python -c "print('\033[94m   HELLO_WORLD   \033[0m')"
RUN python -c "print('\033[95m   HELLO_WORLD   \033[0m')"
RUN python -c "print('\033[96m   HELLO_WORLD   \033[0m')"
RUN python -c "print('\033[97m   HELLO_WORLD   \033[0m')"
RUN python -c "print('\033[98m   HELLO_WORLD   \033[0m')"

стандартный терминал:

цвета консоли печати с помощью команды терминала в одной строке

Ответ 4

На основе ответа @VonC я добавляю следующее в свой файл Dockerfile (который позволяет мне запускать контейнер без ввода переменных среды в кли каждый раз):

ENV TERM xterm-256color
#... more stuff
CMD ["bash", "-l"]

и, конечно же, он работает с:

docker run -it my-image:tag

Для tmux для работы с цветом в моем ~/.tmux.conf мне нужно:

set -g default-terminal "screen-256color"

и для поддержки utf8 в tmux, в моем ~/.bashrc:

alias tmux='tmux -u'

My Dockerfile:

FROM fedora:26
ENV TERM xterm-256color
RUN dnf upgrade -y && \
    dnf install golang tmux git vim -y && \
    mkdir -p /app/go/{bin,pkg,src} && \
    echo 'export GOPATH=/app/go' >> $HOME/.bashrc && \
    echo 'export PATH=$PATH:$GOPATH/bin' >> $HOME/.bashrc && \
    mkdir -p ~/.vim/autoload ~/.vim/bundle && \
    curl -LSso ~/.vim/autoload/pathogen.vim \
        https://tpo.pe/pathogen.vim && \
    git clone https://github.com/farazdagi/vim-go-ide.git \
        ~/.vim_go_runtime && \
    bash ~/.vim_go_runtime/bin/install && \
    echo "alias govim='vim -u ~/.vimrc.go'" >> ~/.bashrc && \
    echo "alias tmux='tmux -u'" >> ~/.bashrc && \
    echo 'set -g default-terminal "screen-256color"' >> ~/.tmux.conf

CMD ["bash", "-l"]

Dockerfile создает изображение, основанное на Fedora 26, обновляет его, устанавливает несколько пакетов (git, vim, golang и tmux), устанавливает плагин pathogen для vim, затем устанавливает здесь git репо vim-go-ide и, наконец, несколько настроек к нескольким конфигурационным файлам, чтобы получить цвет и работу utf8. Просто нужно добавить постоянное хранилище, возможно, установленное под /app/go.

Если у вас есть изображение со всеми уже установленными инструментами разработки, просто создайте оператор Dockerfile с ENV и добавьте команды для изменения конфигурационных файлов в инструкции RUN без команд установки и используйте свою базу изображения в инструкции FROM. Я предпочитаю это решение, потому что я ленив и (помимо начальной настройки), он сохраняет ввод текста, когда вы хотите запустить изображение.

Использование vim и плагинов в tmux