如何在Docker容器中设置PS1

问题描述 投票:0回答:11

我想为容器设置

$PS1
环境变量。它帮助我识别多级或复杂的 Docker 环境设置。目前 docker 容器提示:

root@container-id# 

如果我可以按如下方式更改它,我可以通过查看

$PS1
提示本身来识别容器。

[Level-1]root@container-id# 

我通过制作自己的图像(

$PS1
)、
Dockerfile
文件等来导出
.profile
进行了实验。但它没有反映。

docker dockerhub
11个回答
11
投票

我有同样的问题,但在

docker-compose
上下文中。
以下是我设法使其发挥作用的方法:

# docker-compose.yml

version: '3'
services:
  my_service:
    image: my/image
    environment:
      - "PS1=$$(whoami):$$(pwd) $$ "

只需将 PS1 值作为环境变量传递到

docker-compose.yml
配置文件中即可。
请注意如何转义美元符号以防止
docker-compose
插入值(文档)。


9
投票

这个 Dockerfile 通过执行以下操作来设置

PS1

RUN echo 'export PS1="[\u@docker] \W # "' >> /root/.bash_profile

3
投票

我们使用类似的技术来跟踪复杂容器构建中的输入和输出。

https://github.com/ianmiell/shutit/blob/master/shutit_global.py#L1338

这条线代表了处理 docker/(p)expect 组合来之不易的经验的产物:

"SHUTIT_BACKUP_PS1_%s=$PS1 && PS1='%s' && unset PROMPT_COMMAND"

如果您想恢复,备份提示符会很方便,使用 PS1= 设置 PS1 会设置 PS1,取消设置 PROMPT_COMMAND 会消除终端重置等带来的任何令人讨厌的意外情况。

如果问题是如何确保在运行容器时设置它(而不是构建),那么您可能需要根据容器的运行方式向 .bashrc / .profile 文件添加一些内容。据我所知,没有办法用 dockerfile 指令确保它并使其持续存在。


3
投票

在 debian 9 中,为了运行 bash,这有效:

RUN echo 'export PS1="[\$ENV_VAR] \W # "' >> /root/.bashrc

它通常以root身份运行,我通常知道我在docker中,所以我想要一个提示来指示容器是什么,所以我使用了一个环境变量。我猜我使用的 bash 会优先加载 .bashrc。


3
投票

以下解决方案假设您已使用 Dockerfile

USER
为 Bash 设置非 root Linux 用户。


您可能尝试过但没有成功的方法:

ENV PS1='[docker]$' ## may not work

使用

ENV
设置
PS1
可能会失败,因为启动交互式 shell 时,该值可能会被预先存在的 .bashrc 中的默认设置覆盖。一些 Linux 发行版对
PS1
有自己的看法,并将其设置在每个用户的初始 .bashrc 中(例如,Ubuntu 就是这样做的)。 解决方法是修改 Dockerfile 以在用户 .bashrc 的末尾

设置所需的值——覆盖脚本中的任何早期设置。

FROM ubuntu:20.04 # ... USER myuser ## the username RUN echo "PS1='\n[ \u@docker \w ]\n$ '" >>.bashrc

我通常创建 /home/USER/.bashrc 或 /root/.bashrc,具体取决于 Dockerfile 的用户是谁。效果很好。我试过了

1
投票
ENV PS1 '# '

但这对我来说从来没有用过。
    

以下是运行容器时设置

1
投票
的方法:

docker run -it \
  python:latest \
  bash -c "echo \"export PS1='[python:latest] \w$ '\" >> ~/.bashrc && bash"

我制作了一个小包装脚本,以便能够使用我的自定义提示运行任何图像:

#!/usr/bin/env bash # ~/bin/docker-run set -eu image=$1 docker run -it \ -v $(pwd):/opt/app -w /opt/app ${image} \ bash -c "echo \"export PS1='[${image}] \w$ '\" >> ~/.bashrc && bash"

尝试使用 docker options 设置环境变量

1
投票
示例:

docker run \ -ti \ --rm \ --name ansibleserver-debug \ -w /githome/axel-ansible/ \ -v /home/lordjea/githome/:/githome/ \ -e "PS1=DEBUG$(pwd)# " \ lordjea/priv:311 bash

docker --help Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container Options: ... -e, --env list Set environment variables ...
    
您应该将其设置为 

0
投票
,而不是

.bashrc

只需从您的根目录或主页打开 
.profile

并将

PS1='\u@\h:\w\$ '

 替换为 
PS1='\e[33;1m\u@\h: \e[31m\W\e[0m\$ '
 或您想要的任何内容。
请注意,您需要重新启动容器。

在我的 MAC 上,我有一个名为 lxsh 的别名,它将使用当前目录中的 ubuntu 映像启动 bash shell(

0
投票
)。为了使 shell 的提示发生变化,我将主机文件安装到

/root/.bash_aliases 上。这是一个肮脏的黑客行为,但它确实有效。完整别名:

alias lxsh='echo "export PS1=\"lxsh[\[$(tput bold)\]\t\[$(tput sgr0)\]\w]\\$\[$(tput sgr0)\] \"" > $TMPDIR/a5ad217e-0f2b-471e-a9f0-a49c4ae73668 && docker run --rm --name lxsh -v $TMPDIR/a5ad217e-0f2b-471e-a9f0-a49c4ae73668:/root/.bash_aliases -v $PWD:$PWD -w $PWD -it ubuntu'

至少在 Debian docker 中,Bash 提示符是在 

0
投票
中设置的:

# set a fancy prompt (non-color, overwrite the one in /etc/profile)
# but only if not SUDOing and have SUDO_PS1 set; then assume smart user.
if ! [ -n "${SUDO_USER}" -a -n "${SUDO_PS1}" ]; then
  PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi

因此,您可以为
SUDO_USER

SUDO_PS1

 设置虚拟值,并且在 
PS1
 中设置提示不会被 Bash 覆盖:
$ docker run --rm -it -e SUDO_PS1=dummy -e SUDO_USER=dummy -e PS1='[docker]$ ' debian:11.7 bash 
[docker]$ 


© www.soinside.com 2019 - 2024. All rights reserved.