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

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

问题描述:

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

在我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");变量我总是得到空。

如果我在env_file设置一个不存在的文件,报告说,当我运行它,所以我给理所当然地认为是定位文件。

如果我设置的变量是这样的:

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

我得到 “ComposeLiteral” 评估 “TEST” 的时候。

这是通过与环境变量的文件的应用程序的正确方法是什么?

+0

你是不是想你的图像或执行过程中在生成过程中得到这个变量? – lifeisfoo

+0

执行期间。这个想法是允许容器化的应用程序读取这些值。 – vtortola

+0

Linux。它使用.NET Core 2.0 – vtortola

问题是我使用的config.env文件是从UTF8 BOM开始的,这使得文本编辑器向我展示了相同的内容,但是导致docker撰写了其他内容。

当您添加通过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

我无法重现您的问题。如果我开始使用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。如果您看到使用同一个示例的不同行为,是否可以更新您的问题以包含完整的重现器?

+0

没有一种方法不涉及运行专门的脚本吗?它似乎通过文件它应该是可能的。 – vtortola

+0

我不跟着你。这里没有特别的脚本。只有一个环境变量成功传递给Docker'CMD'。 – larsks

+0

我的歉意,你是对的。我在移动设备上快速浏览了您的文章,并非常了解它。你的代码运行良好,正是我自己想要做的。但是,问题在于我的config.env以UTF8 BOM开头。非常感谢您花时间做出榜样。 – vtortola