dhd*_*d80 2 environment-variables docker docker-compose
我试图让 Docker-Compose 中的环境变量工作。我的文件:
环境/测试.env:
XUSER=you
XHOME=/home/${XUSER}
Run Code Online (Sandbox Code Playgroud)
docker-compose.yml:
version: '3'
services:
abc:
build: .
image: xyz:latest
container_name: xyz
env_file:
- env/test.env
user: "${XUSER}"
Run Code Online (Sandbox Code Playgroud)
docker-compose up --build
docker-compose 配置
WARNING: The XUSER variable is not set. Defaulting to a blank string.
services:
qernel:
build:
context: xyz
container_name: xyz
environment:
XHOME: /home/you
XUSER: you
image: xyz:latest
user: ''
Run Code Online (Sandbox Code Playgroud)
如您所见 user: '' 是一个空字符串,但 env_file 有效。我发现了一些关于这个问题的旧错误报告,我不确定我做错了什么。
小智 7
您需要做的是在与 docker-compose.yml 文件相同的目录中创建 .env 文件,.env的内容是:
XUSER=user1
Run Code Online (Sandbox Code Playgroud)
然后运行 docker-compose config
参考: https: //docs.docker.com/compose/environment-variables/
升级到 Docker Desktop 4.12.0 后我也开始遇到这个问题。此错误开始发生在 内带引号的字符串.env(当使用env_file加载变量时docker-compose.yml)。在这种情况下,请务必使用单引号而不是双引号,即
MY_VAR='foo$bar'
# ... instead of...
MY_VAR="foo$bar"
Run Code Online (Sandbox Code Playgroud)
它说WARNING: The XUSER variable is not set. Defaulting to a blank string.因为${XUSER}在执行时不存在:
user: "${XUSER}"
Run Code Online (Sandbox Code Playgroud)
${XUSER}不在您的环境中(您可以通过运行来验证这一点:env | grep XUSER,它应该不输出任何内容),并且 docker-compose 没有找到任何相同级别的 .env 文件,或者在您运行docker-compose up --build或docker-compose config
重命名env/test.env为.env和将它放在一个文件夹容器的根的docker-compose文件,使泊坞窗自动解析它。
或使用:
docker-compose --env-file path/to/env/test.env up --build
docker-compose --env-file path/to/env/test.env config
Run Code Online (Sandbox Code Playgroud)
通过运行以下命令在您的环境中手动导出它们:
export XUSER=you && export XHOME=/home/${XUSER}
Run Code Online (Sandbox Code Playgroud)
或者您使用您的env/test.env文件作为源(请注意,您需要以“export”为前缀):
env/test.env:
export XUSER=you
export XHOME=/home/${XUSER}
Run Code Online (Sandbox Code Playgroud)
然后你的跑步. /path/to/env/test.env或source /path/to/env/test.env
尽管其他答案都是正确的,但它们并没有充分突出潜在的误解:
使用该env_file选项,您可以指定一个包含要注入到容器环境中的变量的文件。
使用变量替换,docker-compose.yml您可以访问命令环境中的docker-compose变量,即在主机上。您可以使用 OS/shell 的常用机制来设置这些,例如bash:
export XUSER=you
docker-compose up
Run Code Online (Sandbox Code Playgroud)
此外,docker-compose您可以使用当前目录中的.env文件 。
因此,在你具体的例子你应该移动env/test.env到.env的变量添加到环境docker-compose的变量替换。如果您还想将它们添加到容器中的环境中,您可以这样做:
version: '3'
services:
abc:
build: .
image: xyz:latest
container_name: xyz
# add variables from the docker-compose environment to the container:
environment:
- XUSER=$XUSER
# or even shorter:
- XHOME
# use variable from the docker-compose environment in the config:
user: "${XUSER}"
Run Code Online (Sandbox Code Playgroud)
由于 +1.28.env文件放置在项目根目录中,而不是执行 docker-compose 的位置。如果您这样做,变量将自动拉出以供容器使用。
这在开发中非常有效,特别是使用绑定安装卷可以.env在项目根目录中进行组合,而无需通过包含.env在来进入映像构建.dockerignore
但在生产中,我不太愿意将其包含在我的项目根目录中,特别是因为我是从 github 上拉取这些项目文件的。Compose 文件期望它们在生产环境中进行替换SECRET_VAR=${SECRET_VAR}
因此,一种黑客解决方案是将.env文件粘贴在我的生产目录树中,远离我的项目(理想情况下,这些文件来自托管服务上的环境存储或另一个加密存储),但在运行时将这些变量注入到容器中通过使用--env_fileCompose up 中的标志。
该env_file标志的工作原理如下:
docker-compose -f docker-compose.prod.yml --env-file ../.env up -d
它在文档中
| 归档时间: |
|
| 查看次数: |
13659 次 |
| 最近记录: |