Dockerfile 即使在单个子 shell 中也不会获取 .bashrc

问题描述 投票:0回答:3

我正在尝试寻找来源

.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 中工作
bash docker shell dockerfile
3个回答
2
投票

通常

~/.bashrc
包含类似以下内容:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

这是非常正常的 -

.bashrc
仅适用于交互式会话。因为
RUN
是非交互式的,所以它就退出了。

Aaa无论如何,我建议,如果您只想添加环境变量,请将它们输出到

/etc/profile.d
. /etc/profile


0
投票

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"

0
投票

基于问题的评论

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

参考

© www.soinside.com 2019 - 2024. All rights reserved.