Docker bash prompt does not display color output

后端 未结 5 1128
闹比i
闹比i 2020-12-23 17:10

I use command: docker run --rm -it govim bash -l to run docker images but it does not display color output. If I source ~/.bash_profile or run

相关标签:
5条回答
  • 2020-12-23 17:26

    Adding to VonC's answer, I made this bash function:

    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" "$@"
    }
    
    0 讨论(0)
  • 2020-12-23 17:26

    Adding -t is working for me:

    docker exec -t vendor/bin/phpunit
    
    0 讨论(0)
  • 2020-12-23 17:32

    Based on @VonC's answer I adding the following to my Dockerfile (which allows me to run the container without typing the environment variables on the cli every time) :

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

    and sure enough it works with:

    docker run -it my-image:tag
    

    For tmux to work with color, in my ~/.tmux.conf I need:

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

    and for utf8 support in tmux, in my ~/.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"]
    

    The Dockerfile builds an image based off Fedora 26, updates it, installs a few packages (git, vim, golang and tmux),installs the pathogen plugin for vim, then it installs a git repo from here vim-go-ide and finally does a few tweaks to a few config files to get color and utf8 working fine. Just need to add persistent storage, probably mounted under /app/go.

    If you have an image with all the development tools already installed, just make a Dockerfile with ENV statement and add the commands to modify the config files in a RUN statement without the installation commands and use your base image in the FROM statement. I prefer this solution because I'm lazy and (besides the initial setup) it saves typing when you want to run the image.

    Using vim and plugins within tmux

    0 讨论(0)
  • 2020-12-23 17:41

    The OP SolomonT reports that docker run with env do work:

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

    And Fernando Correia adds in the comments:

    To get both color support and make tmux work, I combined both examples:

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

    As chepner commented (earlier answer), .bash_profile is sourced (itis an interactive shell), since bash_prompt is called by .bash_profile.

    But docker issue 9299 illustrates that TERM doesn't seem to be set right away, forcing the users to open another bash with:

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

    You have similar color issues with issue 8755.

    To illustrate/reproduce the problem:

    docker exec -ti $CONTAINER_NAME tty
    not a tty
    

    The current workaround is :

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

    Both are supposing you have a running container first, which might not be convenient here.

    0 讨论(0)
  • 2020-12-23 17:48

    I think this is something that you'd have to implement manually. My container has python, so here's how I print in color using a single line:

    example docker file:

    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')"
    

    standard terminal:

    0 讨论(0)
提交回复
热议问题