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

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

总结

我正在使用 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}
不是正确的语法吗?

docker environment-variables visual-studio-code
1个回答
23
投票

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

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

如果您查看 run 命令的源代码,您会发现环境变量不是通过 bash 命令设置的。这只是一系列字符串赋值。

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

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

示例

Dockerfile

ENV FIRST=ONE
ENV SECOND=${FIRST}

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

docker-compose

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

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

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

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