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

通过Docker compose将环境变量传递给Docker容器中的应用程序,docker,environment-variables,docker-compose,visual-studio-2017,asp.net-core-2.0,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: Docke

我想通过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中,我有:

但是当我尝试使用Environment.GetEnvironmentVariableTEST读取变量时;我总是得到空值

如果我在env_文件中设置了一个不存在的文件,当我运行它时它会抱怨,因此我理所当然地给出了查找该文件的方法

如果我这样设置变量:

  app.web:
    image: app.web
    environment: 
      - TEST=ComposeLiteral
    build:
      context: ./path.to.project
      dockerfile: Dockerfile
在评估测试时,我会变得很镇静


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

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

version: "2"

services:
  app.web:
    image: app.web
    env_file: 
      - ./path.to.project/config.env
    build:
      context: ./path.to.project
      dockerfile: Dockerfile
FROM alpine
RUN apk add --update python3
COPY dumpenv.py /dumpenv.py
CMD python3 /dumpenv.py
在path.to.project中,我使用以下Dockerfile:

version: "2"

services:
  app.web:
    image: app.web
    env_file: 
      - ./path.to.project/config.env
    build:
      context: ./path.to.project
      dockerfile: 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构建此环境,然后连接到服务,我会看到:

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

你可以在网上找到这个完整的例子。如果您在同一示例中看到不同的行为,是否可以更新您的问题以包含完整的复制程序?

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

通过Visual Studio添加文本文件时,将添加BOM表

我创建了一个

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

config.env:

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

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

您是在构建映像期间还是在执行期间尝试获取此变量?在执行期间。其思想是允许容器化应用程序读取这些值。它将.NET Core 2.0try与env_文件一起使用:./path.to.project/config.env。它也不起作用。是否有一种方法不涉及运行临时脚本?从文件上看,这应该是可能的。我不明白你的意思。这里没有特别的脚本。刚刚有一个环境变量成功地传递给Docker CMD。很抱歉,你是对的。我用手机快速阅读了你的帖子,小姐听懂了。您的代码运行良好,这正是我自己想要做的。但是,问题是我的config.env以UTF8 BOM开头。非常感谢您花时间举个例子。