如何在 Visual Studio Code docker 容器内运行的 .devcontainer 使用的 env 文件中引用另一个环境变量?

fne*_*net 13 environment-variables docker visual-studio-code vscode-settings

概括

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

问题

我正在尝试从其他环境变量动态格式化字符串,但在解析字符串时遇到问题。

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

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

代码

开发容器.json

...

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

...
Run Code Online (Sandbox Code Playgroud)

.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}
Run Code Online (Sandbox Code Playgroud)

输出

当我输入envbash 时,它显示:

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}
Run Code Online (Sandbox Code Playgroud)

我希望它显示的地方:

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
Run Code Online (Sandbox Code Playgroud)

${VARIABLE_NAME}不是语法正确?

Cha*_*ens 11

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

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

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

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

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

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

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

例子

文件

ENV FIRST=ONE
ENV SECOND=${FIRST}
Run Code Online (Sandbox Code Playgroud)

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

docker-compose

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

services:
  myapp:
    environment:
      - VAR_IN_MY_CONTAINER=${VAR_ON_MY_HOST}
Run Code Online (Sandbox Code Playgroud)

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

  • 很高兴我能帮上忙! (2认同)