通过docker-compose将环境变量传递给Docker容器中的应用程序

时间:2017-09-26 15:58:06

标签: docker environment-variables docker-compose visual-studio-2017 asp.net-core-2.0

我想通过docker-compose将环境变量传递给Docker中的容器化应用程序。这是适用于Docker的VS 2017 15.3解决方案工具。

docker.compose.yml 文件中,我有:

  app.web:
    image: app.web
    env_file: 
      - ./path.to.project/config.env
    build:
      context: ./path.to.project
      dockerfile: Dockerfile

config.env 我有:

TEST=Compose 

但是当我尝试使用Environment.GetEnvironmentVariable("TEST");读取变量时,我总是得到null。

如果我在env_file中设置了一个不存在的文件,那么当我运行它时会抱怨,所以我理所当然地认为找到了该文件。

如果我以这种方式设置变量:

  app.web:
    image: app.web
    environment: 
      - TEST=ComposeLiteral
    build:
      context: ./path.to.project
      dockerfile: Dockerfile

评估“TEST”时,我得到“ComposeLiteral”。

将包含环境变量的文件传递给应用程序的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

我无法重现您的问题。如果我从你的Dockerfile开始:

version: "2"

services:
  app.web:
    image: app.web
    env_file: 
      - ./path.to.project/config.env
    build:
      context: ./path.to.project
      dockerfile: Dockerfile

path.to.project中,我使用以下Dockerfile:

FROM alpine
RUN apk add --update python3
COPY dumpenv.py /dumpenv.py
CMD python3 /dumpenv.py

运行一个简单的Web服务器,除了转储环境变量之外什么都不做:

import http.server
import os


class Handler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/plain')
        self.end_headers()

        content = []

        for k, v in os.environ.items():
            content.append('{:20} {}'.format(k, v))

        self.wfile.write(bytes('\n'.join(content), 'utf-8'))
        return


server = http.server.HTTPServer(('0.0.0.0', 8080), Handler)
server.serve_forever()

如果我docker-compose up此环境然后连接到该服务,我会看到:

PWD                  /
TEST                 ComposeLiteral
HOSTNAME             5388e6e2717a
SHLVL                1
HOME                 /root
PATH                 ...

您可以在线here找到完整的示例。如果您使用同一示例看到不同的行为,是否可以更新您的问题以包含完整的复制程序?

答案 1 :(得分:0)

问题是我使用的config.env文件是从UTF8 BOM开始的,使文本编辑器向我显示相同的内容,但导致docker compose读取其他内容。

通过Visual Studio添加文本文件时,会添加BOM。

我创建了example project with the problem

enter image description here

然后在日志中可以看到错误的解析是如何发生的:

config.env:

environment:
  NUGET_FALLBACK_PACKAGES: /root/.nuget/fallbackpackages
  "\uFEFFTEST": Compose

config2.env

environment:
  NUGET_FALLBACK_PACKAGES: /root/.nuget/fallbackpackages
  TEST: Compose

https://github.com/docker/compose/issues/5220