docker-compose - 如何转义环境变量

57
使用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" }}}'

错误: yaml.parser.ParserError: 在解析块映射时在"./docker-compose.yml"的第6行第9列期望逗号,但在"./docker-compose.yml"的第6行第92列找到了"}"

1个回答

104

环境变量(包括其名称)必须完全包含在单引号或双引号中""''

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 不应该允许你在没有引号的情况下这样做!! - drogon
3
@TomislavMikulin,你解决了如何使用env文件的问题吗? - weilbith
1.26版本将支持引号:https://github.com/docker/compose/issues/2854#issuecomment-628020801 - Akito
4
不起作用。单引号不能转义美元符号。例如,- 'MYVAR=$GJ' 将尝试从 Docker 环境文件中解析 $GJ 作为变量。请参见 https://github.com/docker/compose/issues/5965。需要使用双美元符号 $$ 来表示一个转义的 $ - Myridium

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接