我正在使用 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}
不是正确的语法吗?
从文件设置环境变量的工作方式与在终端中设置它们不同。
每一行只是一个在“=”上分割的字符串,该分割的右侧被指定为值,左侧被指定为键。
如果您查看 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 文件都是主机环境的一部分。