通过 docker-compose 将环境变量传递给 Docker 容器中的应用程序
Passing environment variables to application in a Docker container through docker-compose
我想通过 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"。
将带有环境变量的文件传递给应用程序的正确方法是什么?
我无法重现您的问题。如果我从你的 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。如果您使用同一示例看到不同的行为,您能否更新您的问题以包含完整的复制器?
问题是我使用的 config.env 文件以 UTF8 BOM 开头,使得文本编辑器向我显示相同的内容,但导致 docker compose 无法阅读某些内容否则。
当您通过 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
我想通过 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"。
将带有环境变量的文件传递给应用程序的正确方法是什么?
我无法重现您的问题。如果我从你的 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。如果您使用同一示例看到不同的行为,您能否更新您的问题以包含完整的复制器?
问题是我使用的 config.env 文件以 UTF8 BOM 开头,使得文本编辑器向我显示相同的内容,但导致 docker compose 无法阅读某些内容否则。
当您通过 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