定制Docker容器的Bash

8
我尝试为Docker容器的bash提示符设置自定义配置,以在连接时显示git分支名称。
我已经找到了一切使其正常工作的方法,但是我无法在容器构建时执行~/.profile或甚至~/.bash_profile文件。
如果我在容器内手动执行source ~/.profile,那么它就可以正常工作。但我不希望用户输入任何命令来启用自定义提示符。
我尝试将RUN /bin/bash -c "source /root/.profile"或RUN source /root/.profile放入我的Dockerfile,将source /root/.profile放入我的entrypoint.sh文件,但都没有成功。
我看到有些解决方案是在运行docker run时使用,但我正在使用docker-compose。
谢谢大家的建议!

你能在bash命令中指定-l标志吗?这将导致子shell bash以与登录shell相同的方式初始化,从而应该调用配置文件。 - Greg Tarsa
我在我的docker-entrypoint.sh中尝试了它:/bin/bash -l -c“source /root/.profile”。但是什么也没发生!我做错了吗? - Kern
使用docker run -v ~/.profiledocker run -v ~/.bash_profile有什么问题?我猜你可以在docker-compose中做同样的事情吗? - user2915097
如果你使用-l选项(或结合使用-lc),那么shell应该将profiles作为启动的正常部分运行。有关详细信息,请查看man bash - Greg Tarsa
1
@Kern 你能展示一下你的Dockerfile吗?我尝试过类似于COPY mybashrc /root/.bashrc(使用bash和ubuntu镜像),当运行bash时它会被捕获... - Salem
2个回答

4
我不确定使用“~/.profile”配置文件是实现您想要的功能的最佳方法。此外,“RUN source/root/.profile”也没有任何作用,因为该行仅执行一次,并且在尝试在容器内部执行bash二进制文件时不会保持持久性(它实际上会运行一个新的bash会话)。
所以…首先,您尝试进行的配置类型应该在“.bashrc”文件中进行(只是因为通常出现在这个位置)。
然后,正如bash手册所说:
当bash作为交互式登录shell或作为非交互式shell使用--login选项启动时,如果存在该文件,则首先从文件/etc/profile读取和执行命令。在读取该文件之后,它会按顺序查找~/.bash_profile、~/.bash_login和~/.profile文件。
还有:
当启动一个不是登录shell的交互式shell时,如果存在这些文件,则bash从/etc/bash.bashrc和~/.bashrc读取并执行命令。
您应该采取的措施可能是:
在Dockerfile中:
COPY config/.bashrc /root/.bashrc

您需要复制到容器中的.bashrc文件位于配置存储库中。这是您应该放置配置的位置。
然后,在入口点中:
exec "$@"

接下来,您可以使用docker命令运行bash:

docker run XXX /bin/bash

谢谢Seb,就是这样:D! 我将这些行附加到了.bashrc文件中,并且在第一次运行时它确实起作用了! - Kern

1

当我运行docker容器时,我需要做的是使~/.bash_profile起作用。您可以使用CMD指令将bash作为登录shell启动:

CMD ["bash", "-l"]

每次容器启动时都会运行CMD命令。选项-l将告诉bash以登录shell的方式启动,以确保源文件~/.bash_profile被加载。您可能还对登录和非登录shell之间的区别感兴趣。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接