bash - 在分离模式下运行docker时设置环境变量

标签 bash shell docker

如果我在/root/.bashrc中包含以下行:

export $A = "AAA"

然后,当我以交互方式运行docker容器(docker run -i)时,$ A变量将保留其值。但是,如果我以分离模式运行容器,则无法访问该变量。即使我运行容器明确像.bashrc那样采购
docker run -d my_image /bin/bash -c "cd /root && source .bashrc && echo $A"

这样的行产生一个空的输出。

那么,为什么会这样呢?以及如何设置.bashrc文件中定义的环境变量?

任何帮助将不胜感激!

最佳答案

第一个问题是您正在运行的命令的主机 shell 程序(而不是容器 shell 程序)解释了$A。在您的主机上,$A可能是黑色的,因此您的有效命令将变为:

docker run -i my_image /bin/bash -c "cd /root && source .bashrc && echo "

完全按照它说的做。我们可以对变量进行转义,以便将其发送到容器并在其中正确求值:
docker run -i my_image /bin/bash -c "echo \$A"

但这也将是空白的,因为尽管容器是容器,但 shell 未处于交互模式。但是我们可以强制它为:
docker run -i my_image /bin/bash -i -c "echo \$A"

哇,我们终于得到了我们想要的结果。但是由于没有TTY,bash会增加一个错误。因此,除了交互方式,我们可以设置一个psuedo-TTY:
docker run -t my_image /bin/bash -i -c "echo \$A"

关于bash - 在分离模式下运行docker时设置环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34604079/

相关文章:

java - 使用 Java 和 Node.js 创建 Docker 容器

ruby - 在需要基本操作系统访问的 Docker 上安装 ruby​​ 的最佳方法?

bash - 在 awk 中设置 bash 变量

c - scanf(),Linux 的 shell 输入处理不同,为什么?

C++/OpenFST - 查找库和链接时出错

regex - sed : extract multiple fields in random order

docker - .NET Core Docker-如何在dotnet发布后找到入门应用

bash - 如何在bash中使用通配符重命名文件?

bash - 是否有相当于 setenv 的 bash

linux - 我正在尝试在 bash 中创建多行变量但面临错误 "unexpected EOF while looking for matching ` )' "