docker - 将环境变量传递给容器不起作用

标签 docker environment-variables

我有这个命令:

docker run -e "DB_HOST=thehost" --rm my_application echo $DB_HOST

但它什么也没显示。我期待显示“thehost”。

我试过使用单引号、双引号和不带引号。

我错过了什么?我需要在 my_aplication 的 Dockerfile 中指定 ENV 参数吗?

如果我这样做:

docker run -e "DB_HOST=thehost" --rm my_application echo $PATH

它正确显示 PATH 值。但它忽略了我的环境变量。

最佳答案

这里有几个层次:

  1. 您的本地 shell 扩展命令;
  2. 启动一些 Docker 容器;
  3. 它运行一些其他进程(但不一定是 shell)。

在你的第一个例子中

docker run ... echo $DB_HOST

您的本地 shell 在变量引用传递给 Docker 之前捕获它。

如果你显式地单引号

docker run ... echo '$DB_HOST'

Docker 将找到 /bin/echo(假设它存在于容器中)并使用字符串 $DB_HOST 作为参数启动它,但同样,因为没有 shell涉及到 Docker 端,它尽职尽责地按原样打印出该字符串。

您问题的直接答案是强制在 Docker 端有一个 shell

docker run -e DB_HOST=thehost --rm my_application \
  sh -c 'echo $DB_HOST'

稍微高一点:

  • 如果您运行的是其他语言的程序而不仅仅是 shell 命令,他们会正常看到环境(Python 的 os.environ,Ruby 的 ENV , Node 的 process.env, etc.)
  • 如果您有任何复杂的东西,将它写入一个 shell 脚本,将其复制到一个图像中,然后运行它可能更易于维护,并且隐含地涉及一个 shell(第一行将显示 #!/bin/sh)
  • 在您的 Dockerfile 中,如果您输入 CMD some command,Docker 会自动将其包装在一个 shell 中;这相当于 CMD ["sh", "-c", "some command"]
  • ENTRYPOINT也是如此,但这样使用它可能是一个错误

关于docker - 将环境变量传递给容器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53900818/

相关文章:

regex - htaccess - 如何比较环境变量 - 检查 2 个环境变量是否相同

docker - 尝试在 Windows 上使用 Docker 运行 tensorflow 时发出警告

intellij-idea - IntelliJ : executing a program with environment variables stored in a separated file

environment-variables - 如何从 XCUITest 代码访问 xcconfig 变量

bash - 如何在 grep 中使用 POSIXLY_CORRECT?

django - Procfile 中的 heroku $PORT 变量

mysql - 使用sequelize和docker-compose从 Node 应用程序连接到MySQL DB

node.js - 生成 Xvfb 时出现问题,服务器已经在运行

docker - 如何了解Docker上所有容器执行的历史记录?

Docker:来自守护进程的错误响应:没有这样的 id: