当前位置: 首页 > 知识库问答 >
问题:

Docker容器bash中的环境变量为空[重复]

鞠鸿雪
2023-03-14

我有一个简单的docker容器,它在启动时运行一个导出一些变量的脚本。

所以Dockerfile中的最后一行是CMD./startup.sh

而startup.sh有

#!/usr/bin/env bash

export testvar="test"
echo $testvar
node app.js

运行容器时,终端中的输出显示“test ”,正如我所料。

然而,如果我随后运行< code > docker exec-it * container id * bash 并在容器内运行< code>echo $testvar,它将为空。

环境var没有持久化吗?还是运行docker exec bash的终端没有权限查看它什么的?

共有2个答案

端木令
2023-03-14

如果脚本中不明确需要testvar,那么应该将ENV testvar=test添加到Dockerfile中。

然后,您应该能够在docker文件中使用testvar。

如果您在Dockerfile中需要它,您也可以在Dockerfile中将其声明ENV testvar=test,然后将其作为参数提供给您的脚本,例如CMD。/startup.sh$testvar

在您的脚本中,您需要将导出 testvar=“test” 更改为 testvar=$1,然后您可以像以前一样简单地将其与 echo 命令一起使用。

来源:< br >如何在docker中的构建期间设置环境变量< br > https://www . bael dung . com/Linux/use-command-line-arguments-in-bash-script

卜勇
2023-03-14

Docker exec 在容器中启动一个新的 shell。它不是初始进程的子进程,因此它不会从该进程继承任何环境变量。

如果要设置将在< code>docker exec中可见的环境变量,请在容器本身上设置它们,可以在< code>Dockerfile中设置:

FROM docker.io/node:18

ENV testvar=test
CMD node app.js

或者在< code>docker run命令行中:

docker run -e testvar=test myimagename
 类似资料:
  • 问题内容: 从 尚未在Dockerfile中声明的Docker 容器获取环境变量的最简单方法 是什么 ? 例如,通过某个会话设置的环境变量? 我可以做到,但是我更喜欢只返回值的东西。 我尝试使用,但是替换似乎发生在容器外部,因此我没有从容器中获取env var,而是从我自己的计算机中获取了env var。 谢谢。 问题答案: 在容器中运行以使变量替换发生在容器中的正确方法是:

  • 我有两个shell脚本: 第一个:<代码>1。sh,其内容如下: 第二:<代码>2。sh,其内容如下: 两者都具有执行权限。当我运行<代码>2时。sh,我希望环境变量PROP由1设置和导出。sh,对。这里怎么了?

  • 问题内容: 我已经设置了带有多个docker容器的服务器,可以使用jwilders nginx reversre proxy 访问。运行容器时,可以设置VIRTUAL_HOST环境变量。在容器启动后,我一直试图找出一种更新这些方法的方法。 解决方案在这里发布: 您只需停止docker daemon并在以下位置更改容器配置 要求您停止docker守护程序,但我不想不必诉诸于此。 另一个在这里,使用d

  • 问题内容: 我正在尝试设置一个postgres容器,并希望使用以下命令设置postgres登录名: 所以我像这样创建了docker-compose.yml 我还尝试了将环境变量声明为db部分的其他语法: 但是这些选项似乎都不起作用,因为无论出于什么原因,无论何时我尝试使用各种连接字符串连接到postgres数据库: 与抱怨没有用户数据库相反,它们都给我身份验证失败。 问题答案: 您收到的身份验证错

  • 问题内容: 是否可以重用在多个容器之间共享的环境变量以避免重复,如本示例所示: 问题答案: 该选项可能是好的,但它不支持在撰写文件。其他走的方式是: 扩展名字段(撰写文件3.4+) 如果可以使用3.4+组成文件,则扩展名字段可能是最佳选择: docker-compose.yml env_file指令 docker-compose.yml variables.env * 项目根目录中的 *.env

  • 问题内容: 我是Docker的新手,目前尚不清楚如何从容器访问外部数据库。硬编码连接字符串的最佳方法是吗? 问题答案: 您可以使用该标志将环境变量传递到您的容器。 启动脚本的示例: 或者,如果您不希望在命令行中使用,等显示该值,则可以直接从当前环境中获取该值,如果您不带: 如果您有许多环境变量,尤其是要保密的话,可以使用env文件: --env-file标志将文件名作为参数,并期望每行采用VAR