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

How to change the default prompt in a singularity container

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

但是,不幸的是,Singularity 做了一些事情来强制执行它自己的提示,如下所示: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> "

...这会覆盖我的提示!此外,使用 PROMPT_COMMAND 的方法因 /.singularity.d/actions/shell.../run 中的某些代码而受阻。

解决方法是让用户使用自己的 .profile。但是,如果用户的主目录绑定到容器内的 home,那将不起作用,因为容器内外的 .profile 是相同的。另外,我不希望用户干预只是为了更改提示。

如何获得提示?

默认情况下,shells 运行 by singularity 明确不加载任何配置文件或 rc 文件。提示虽然很烦人,但提醒你你在图像中,而不是主机OS。

如果您无论如何都想覆盖它,则需要向 /.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 步骤所必需的。

编辑: 旧版本的奇点在第一行使用 shebang 指定备用 shell,但已更改为 -c /path/to/shell