docker-compose - 如何转义环境变量
Posted
技术标签:
【中文标题】docker-compose - 如何转义环境变量【英文标题】:docker-compose - how to escape environment variables 【发布时间】:2017-06-18 17:35:34 【问题描述】:使用docker-compose
v2 环境变量可以简单地设置:
enviroment:
- MONGO_PATH=mongodb://db-mongo:27017
完整的docker-compose.yml
文件为:
version: '2'
services:
web:
build: .
environment:
- MONGO_PATH=mongodb://db-mongo:27017
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
depends_on:
- db-mongo
- db-redis
db-mongo:
image: mongo
restart: unless-stopped
command: --smallfiles
ports:
- "27017:27017"
volumes:
- ./data:/data/db
[...]
但是,如何转义不是纯字符串的环境变量?
"database": "data": "host": "mongo"
我试过了:
NODE_CONFIG=\"database": \"data"\: \"host": "mongo"\, "session": \"host": "redis" \\\
NODE_CONFIG="\"database": \"data"\: \"host": "mongo"\, "session": \"host": "redis" \\\"
NODE_CONFIG='"database": "data": "host": "mongo", "session": "host": "redis" '
ERROR: yaml.parser.ParserError: while parsing a block mapping in “./docker-compose.yml”,第 6 行,第 9 列,但 在“./docker-compose.yml”第 6 行第 92 列中找到 ''
【问题讨论】:
【参考方案1】:环境变量(包括它们的名称),必须用单引号或双引号括起来:""
或 ''
environment:
- 'NODE_CONFIG="database": "data": "host": "mongo", "session": "host": "redis" '
并使用双引号:
environment:
- 'PORT=3000'
- "NODE_CONFIG=\"database\": \"data\": \"host\": \"mongo\", \"session\": \"host\": \"redis\" "
值得注意的是,使用双引号 ""
,如 bash,将允许将变量放在环境变量中。
"MY_HOME_ENV_VARIABLE=$HOME"
【讨论】:
docker compose 不应该允许你在没有引号的情况下这样做!! 另见:Inconsistent env var parsing from docker-compose.yml #2854 @TomislavMikulin 你知道如何处理 env 文件了吗? 支持 1.26 中的报价:github.com/docker/compose/issues/2854#issuecomment-628020801 不起作用。单引号不会转义美元符号。例如- 'MYVAR=$GJ'
将尝试将 $GJ
解析为 docker env 文件中的变量。见https://github.com/docker/compose/issues/5965
。一个双美元的$$
需要用来表示一个转义的$
。以上是关于docker-compose - 如何转义环境变量的主要内容,如果未能解决你的问题,请参考以下文章
docker-compose环境会覆盖jar中的变量,docker环境变量和jar中的变量是如何映射的?
如何将环境变量从 docker-compose 传递给项目?
如何从.env文件获取环境变量到docker-compose.yml?
如何获得正确的 docker-compose Multiline 环境变量格式?