【问题标题】:How to reference another environment variable inside an env file used by .devcontainer running inside a Visual Studio Code docker container?如何在 Visual Studio Code docker 容器中运行的 .devcontainer 使用的 env 文件中引用另一个环境变量?
【发布时间】:2026-01-14 02:35:01
【问题描述】:

总结

我正在使用 Visual Studio Code 运行 docker 容器并将我的环境变量作为文件传递。

问题

我正在尝试从其他环境变量动态格式化字符串,但无法解析字符串。

我能够构建容器并且调试终端选项卡显示没有问题。

我目前没有使用 docker-compose.yml,而是使用 Visual Studio .devcontainer 设置。

代码

devcontainer.json

...

"runArgs": [
        "--env-file", "${localWorkspaceFolder}/.env.dev"
, 

...

.env.dev

DATABASE_DATABASE=database
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=localhost
DATABASE_PORT=5432
DATABASE_DRIVER=postgresql
CONNECTION_STRING=${DATABASE_DRIVER}://${DATABASE_USER}:${DATABASE_PASSWORD}@${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_DATABASE}

输出

当我在 bash 中输入 env 时,它会显示:

DATABASE_DATABASE=database
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=localhost
DATABASE_PORT=5432
DATABASE_DRIVER=postgresql
CONNECTION_STRING=${DATABASE_DRIVER}://${DATABASE_USER}:${DATABASE_PASSWORD}@${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_DATABASE}

我希望它显示在哪里:

DATABASE_DATABASE=database
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=localhost
DATABASE_PORT=5432
DATABASE_DRIVER=postgresql
CONNECTION_STRING=postgresql://user:password@$localhost:5432/database

问题

${VARIABLE_NAME} 的语法不正确吗?

【问题讨论】:

  • 我认为你需要用引号括起来:CONNECTION_STRING="${DATABASE_DRIVER}://${DATABASE_USER}:${DATABASE_PASSWORD}@${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_DATABASE}"
  • @peinearydevelopment 感谢您的评论,不幸的是,这只是返回 "${DATABASE_DRIVER}://${DATABASE_USER}:${DATABASE_PASSWORD}@${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_DATABASE}" 作为新的环境变量。也许vscode在.env文件中时不解析env变量?

标签: docker visual-studio-code environment-variables vscode-settings


【解决方案1】:

从文件中设置环境变量与在终端中设置环境变量的工作方式不同。

每一行只是一个在“=”上分割的字符串,分割的右侧被分配为值,左侧被分配为键。

如果你查看运行命令的源代码:

https://github.com/docker/cli/blob/master/cli/command/container/run.go

您会看到环境变量不是通过 bash 命令设置的。这只是一系列字符串赋值。

环境文件几乎总是如此。它们是字符串,并且是这样设置的。您尝试使用的语法仅适用于努力将 env 文件作为一系列 bash 命令运行的平台,但 docker 不会这样做。这与 VS 代码无关,这只是 env 文件通常的工作方式。

一种可能的解决方法是将此分配从您的 env 文件移动到您的 Dockerfile 或 docker-compose。这些指令作为 bash 命令运行,因此您的变量调用将起作用。

示例

Dockerfile

ENV FIRST=ONE
ENV SECOND=${FIRST}

在这里,在您的容器内 echo ${SECOND} 将打印出 ONE。

docker-compose

Docker 组合环境变量的工作方式略有不同。它不会在您的撰写文件中按顺序设置变量,因此引用您在同一服务定义中设置的变量不起作用。但是,如果您的变量设置在与撰写文件相同目录的 .env 文件中,那么您可以通过以下方式访问这些值:

services:
  myapp:
    environment:
      - VAR_IN_MY_CONTAINER=${VAR_ON_MY_HOST}

发生这种行为是因为 compose 将其目录中的任何 .env 文件视为宿主环境的一部分。

【讨论】:

  • > “一种可能的解决方法是将此分配从您的 env 文件移动到您的 Dockerfile 或 docker-compose。这些指令作为 bash 命令运行,因此您的变量调用将起作用”工作?我正在寻找工作示例而不是理论
  • 感谢您的实际更新!现在我觉得我明白了
  • 很高兴能帮上忙!
最近更新 更多