我想为$PS1
容器设置环境变量。它可以帮助我识别多级或复杂的 docker 环境设置。目前 docker 容器提示:
root@container-id#
如果我可以将其更改如下,我可以通过查看$PS1
提示本身来识别容器。
[Level-1]root@container-id#
我$PS1
通过制作自己的图像(Dockerfile
)、.profile
文件等进行了导出实验。但这并没有反映出来。
此DockerfilePS1
通过执行以下操作设置:
RUN echo 'export PS1="[\u@docker] \W # "' >> /root/.bash_profile
我有同样的问题,但在docker-compose
上下文中。
这是我设法使它工作的方法:
# docker-compose.yml
version: '3'
services:
my_service:
image: my/image
environment:
- "PS1=$$(whoami):$$(pwd) $$ "
docker-compose.yml
只需在配置文件中将 PS1 值作为环境变量传递。
注意美元符号需要如何转义以防止docker-compose
插入值(文档)。
我们使用类似的技术来跟踪复杂容器构建中的输入和输出。
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 指令确保它并使其持久存在。
我通常创建 /home/USER/.bashrc 或 /root/.bashrc,这取决于 Dockerfile 的 USER 是谁。效果很好。我试过了
ENV PS1 '# '
但这对我没有用。
这是一种PS1
在运行容器时设置的方法:
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 选项设置环境变量
例子:
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
...
在 debian 9 中,为了运行 bash,这很有效:
RUN echo 'export PS1="[\$ENV_VAR] \W # "' >> /root/.bashrc
它通常以 root 身份运行,并且我通常知道我在 docker 中,所以我想要一个提示来指示容器是什么,所以我使用了一个环境变量。而且我猜我使用的 bash 会优先加载 .bashrc。
以下解决方案假定您已使用 DockerfileUSER
为 Bash 设置了非 root Linux 用户。
您可能尝试过但没有成功的方法:
ENV PS1='[docker]$' ## may not work
使用ENV
to set可能会失败,因为在启动交互式 shell 时,预先存在的.bashrcPS1
中的默认设置会覆盖该值。一些 Linux 发行版固执己见,并将其设置在每个用户的初始 .bashrc 中(例如, Ubuntu 就是这样做的)。PS1
修复方法是修改 Dockerfile 以在用户的 .bashrc末尾设置所需的值——覆盖脚本中的任何早期设置。
FROM ubuntu:20.04
# ...
USER myuser ## the username
RUN echo "PS1='\n[ \u@docker \w ]\n$ '" >>.bashrc
您应该将其设置为.profile
,而不是.bashrc
。
只需.profile
从您的根目录或家中打开并替换PS1='\u@\h:\w\$ '
为PS1='\e[33;1m\u@\h: \e[31m\W\e[0m\$ '
您想要的任何内容。
请注意,您需要重新启动容器。
在我的 MAC 上,我有一个名为 lxsh 的别名,它将使用我当前目录(详细信息)中的 ubuntu 映像启动一个 bash shell。为了使 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'