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 环境变量格式?

如何解决 docker-compose 环境变量不起作用 ASP.Net Core MVC

使用 nginx 将环境变量从 docker-compose 传递到 vue 应用程序