我正在尝试寻找来源
.bashrc
但没有运气
USER user
SHELL ["/bin/bash", "-c"]
RUN echo "export TEST_VAR=test" >> /home/user/.bashrc && tail /home/user/.bashrc && source /home/user/.bashrc && echo "1 \"${TEST_VAR} 2\" var" && exit 1
我期望这个
RUN
命令打印1 "test" 2
但我得到的是
Step 13/40 : RUN echo "export TEST_VAR=test" >> /home/user/.bashrc && tail /home/user/.bashrc && source /home/user/.bashrc && echo "1 \"${TEST_VAR}\" 2" && exit 1
---> Running in b870d36e9dd0
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
export TEST_VAR=test
1 "" 2
在 docker 中处理 shell 有什么问题?我只想获取
~/.bashrc
一次,并在 source
调用下面的后续命令中使用所有公开的变量,但它甚至无法在与 && 连接的单个子 shell 中工作
通常
~/.bashrc
包含类似以下内容:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
这是非常正常的 -
.bashrc
仅适用于交互式会话。因为 RUN
是非交互式的,所以它就退出了。
Aaa无论如何,我建议,如果您只想添加环境变量,请将它们输出到
/etc/profile.d
和. /etc/profile
。
Docker 中的大多数路径根本不读取 shell 点文件。您需要使用其他方法来为您的应用程序提供配置;例如,如果您需要在启动容器之前动态设置内容,则可以使用 Dockerfile
ENV
设置环境变量或入口点包装器脚本。
让我们具体看一下示例的简化形式:
SHELL ["/bin/bash", "-c"]
RUN echo "export TEST_VAR=test" >> $HOME/.bashrc
RUN echo "$TEST_VAR"
GNU Bash 手册中的Bash 启动文件列出了在哪种情况下读取哪些点文件。对于最后一行,Docker 结合了
SHELL
和 RUN
行来运行 的等效内容
/bin/bash -c 'echo "$TEST_VAR"'
但是
bash
实例既不是交互式 shell,也不是登录 shell,因此自动读取的唯一点文件是在 $BASH_ENV
环境变量中命名的点文件。 (POSIX sh
根本没有指定任何有关任何 shell 点文件的信息。)
这进一步适用于图像的默认
CMD
,它也将与 sh -c
(或备用 SHELL
)一起运行,并且不会读取点文件。如果 CMD
(或 ENTRYPOINT
或 RUN
)使用 JSON 数组语法,它根本不会调用 shell,也不会读取点文件。
读取 shell 点文件的唯一情况是主容器命令是交互式 shell,这通常不是常见情况。
docker run --rm -it yourimage /bin/bash # reads .bashrc
docker run --rm -it yourimage /bin/bash --login # also reads .profile, .bash_login
这意味着您几乎永远不应该尝试编辑
.bashrc
、/etc/profile
或任何类似文件。如果您需要像示例中那样设置环境变量,请使用 Dockerfile ENV
。
ENV TEST_VAR=test
RUN echo "$TEST_VAR"
基于问题的评论
FROM ubuntu
SHELL ["/bin/bash", "-c"]
ENV BASH_ENV="/etc/bash_env"
USER root
RUN echo "export TEST_VAR=test" >> $BASH_ENV
RUN echo $TEST_VAR
#6 [3/3] RUN echo $TEST_VAR
#6 0.239 test
#6 DONE 0.3s
参考