-1

我想通過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

回答

0

問題是我使用的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

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。如果您看到使用同一個示例的不同行爲,是否可以更新您的問題以包含完整的重現器?

+0

沒有一種方法不涉及運行專門的腳本嗎?它似乎通過文件它應該是可能的。 – vtortola

+0

我不跟着你。這裏沒有特別的腳本。只有一個環境變量成功傳遞給Docker'CMD'。 – larsks

+0

我的歉意,你是對的。我在移動設備上快速瀏覽了您的文章,並非常瞭解它。你的代碼運行良好,正是我自己想要做的。但是,問題在於我的config.env以UTF8 BOM開頭。非常感謝您花時間做出榜樣。 – vtortola

相關問題