通过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” 的时候。
这是通过与环境变量的文件的应用程序的正确方法是什么?
答
问题是我使用的config.env文件是从UTF8 BOM开始的,这使得文本编辑器向我展示了相同的内容,但是导致docker撰写了其他内容。
当您添加通过Visual Studio的文本文件,BOM表添加。
我创建了一个example project with the problem。
然后在日志中可以看到错误的解析是如何发生的:
config.env:
environment:
NUGET_FALLBACK_PACKAGES: /root/.nuget/fallbackpackages
"\uFEFFTEST": Compose
CONFIG2。env中
environment:
NUGET_FALLBACK_PACKAGES: /root/.nuget/fallbackpackages
TEST: Compose
答
我无法重现您的问题。如果我开始使用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。如果您看到使用同一个示例的不同行为,是否可以更新您的问题以包含完整的重现器?
你是不是想你的图像或执行过程中在生成过程中得到这个变量? – lifeisfoo
执行期间。这个想法是允许容器化的应用程序读取这些值。 – vtortola
Linux。它使用.NET Core 2.0 – vtortola