如何更改奇点容器中的默认提示



我正在创建一个Singularity映像,我想要一个自定义的bash提示,就像我可以通过在~/.bash_profile中设置变量PS1来将bash提示设置为普通用户一样。

但是,不幸的是,奇点做了一些事情来强制执行它自己的提示,如下所示:Singularity>。这不是一个很有用的提示。

我试图在定义文件中设置PS1,如本例所示:

# File prompt-test1.def
Bootstrap: shub
From: alpine:latest
%environment
export PS1="[my-container]w$ "

我构建并运行了那个图像,但没有成功:

sudo singularity build prompt-test.sif prompt-test.def
singularity shell prompt-test.sif
# shows Singularity>

使用shell中的env命令,我注意到PROMPT_COMMAND被设置为:

echo $PROMPT_COMMAND
# PS1="Singularity> "; unset PROMPT_COMMAND

所以我试着改变它:

# File prompt-test2.def
Bootstrap: shub
From: alpine:latest
%environment
export PROMPT_COMMAND='PS1="[my-container]w$ "; unset PROMPT_COMMAND'

但提示保持不变!但现在,集装箱内的PROMPT_COMMAND看起来像

echo $PROMPT_COMMAND
# PS1="[my-container]w$ "; unset PROMPT_COMMAND; PROMPT_COMMAND="${PROMPT_COMMAND%%; PROMPT_COMMAND=*}";PS1="Singularity> "

编辑为替换为更好的信息:问题在于/.singularity.d/env中文件的来源顺序。用户定义的环境变量在01-base.sh中设置,但在99-base.sh中有行

PS1="Singularity> "

它覆盖了我的提示!此外,由于/.singularity.d/actions/shell.../run中的一些代码,使用PROMPT_COMMAND的方法受到阻碍。

一种变通方法是用户使用自己的.profile。但是,如果用户的主目录绑定到容器内的主目录,则这是不起作用的,因为容器内外的.profile是相同的。此外,我不希望用户干预只是为了更改提示。

我怎样才能得到提示?

默认情况下,奇点运行的shell显式不加载任何概要文件或rc文件。提示虽然很烦人,但它是为了提醒你,你在一个映像中,而不是主机操作系统中。

如果您无论如何都想覆盖它,您需要向/.singularity.d/env添加一个额外的文件,该文件将在其他所有文件之后运行。例如

Bootstrap: docker
From: alpine:latest
%post -c /bin/bash
CUSTOM_ENV=/.singularity.d/env/99-zz_custom_env.sh
cat >$CUSTOM_ENV <<EOF
#!/bin/bash
PS1="[my_container]w $"
EOF
chmod 755 $CUSTOM_ENV

%post之后添加-c /bin/bash告诉奇点使用/bin/bash而不是默认的/bin/sh,这对于之后的多行cat步骤是必要的。

EDIT:早期版本的奇点在第一行使用shebang来指定备用外壳,但已更改为-c /path/to/shell

对我有效的解决方案是在奇点内使用tmux。它有一个标准shell,提示中有路径。

最新更新