我想为容器设置
$PS1
环境变量。它帮助我识别多级或复杂的 Docker 环境设置。目前 docker 容器提示:
root@container-id#
如果我可以按如下方式更改它,我可以通过查看
$PS1
提示本身来识别容器。
[Level-1]root@container-id#
我通过制作自己的图像(
$PS1
)、Dockerfile
文件等来导出.profile
进行了实验。但它没有反映。
我有同样的问题,但在
docker-compose
上下文中。# docker-compose.yml
version: '3'
services:
my_service:
image: my/image
environment:
- "PS1=$$(whoami):$$(pwd) $$ "
只需将 PS1 值作为环境变量传递到
docker-compose.yml
配置文件中即可。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 指令确保它并使其持续存在。
在 debian 9 中,为了运行 bash,这有效:
RUN echo 'export PS1="[\$ENV_VAR] \W # "' >> /root/.bashrc
它通常以root身份运行,我通常知道我在docker中,所以我想要一个提示来指示容器是什么,所以我使用了一个环境变量。我猜我使用的 bash 会优先加载 .bashrc。
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
ENV 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 options 设置环境变量
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
...
您应该将其设置为
.bashrc
。
只需从您的根目录或主页打开
.profile
并将 PS1='\u@\h:\w\$ '
替换为
PS1='\e[33;1m\u@\h: \e[31m\W\e[0m\$ '
或您想要的任何内容。
请注意,您需要重新启动容器。
在我的 MAC 上,我有一个名为 lxsh 的别名,它将使用当前目录中的 ubuntu 映像启动 bash 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 提示符是在
# 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]$