14

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

root@container-id# 

如果我可以将其更改如下,我可以通过查看$PS1提示本身来识别容器。

[Level-1]root@container-id# 

$PS1通过制作自己的图像(Dockerfile)、.profile文件等进行了导出实验。但这并没有反映出来。

4

10 回答 10

7

DockerfilePS1通过执行以下操作设置:

RUN echo 'export PS1="[\u@docker] \W # "' >> /root/.bash_profile
于 2014-11-03T12:58:19.620 回答
7

我有同样的问题,但在docker-compose上下文中。
这是我设法使它工作的方法:

# docker-compose.yml

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

docker-compose.yml只需在配置文件中将 PS1 值作为环境变量传递。
注意美元符号需要如何转义以防止docker-compose插入值(文档)。

于 2018-12-06T08:47:27.410 回答
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 指令确保它并使其持久存在。

于 2014-11-04T07:42:26.393 回答
1

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

ENV PS1 '# ' 

但这对我没有用。

于 2014-11-01T20:48:52.007 回答
1

这是一种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"
于 2018-04-06T14:37:29.907 回答
1

尝试使用 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
...
于 2021-05-07T09:26:20.527 回答
1

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

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

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

于 2019-11-26T15:50:32.960 回答
0

以下解决方案假定您已使用 DockerfileUSER为 Bash 设置了非 root Linux 用户。


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

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

使用ENVto 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
于 2021-09-01T05:10:04.620 回答
0

您应该将其设置为.profile,而不是.bashrc

只需.profile从您的根目录或家中打开并替换PS1='\u@\h:\w\$ 'PS1='\e[33;1m\u@\h: \e[31m\W\e[0m\$ '您想要的任何内容。

请注意,您需要重新启动容器。

于 2015-10-17T04:56:46.793 回答
0

在我的 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'
于 2020-12-03T23:43:40.923 回答