簡體   English   中英

Docker-compose - 創建一個卷並在啟動時將文本文件復制到其中,並在運行后通過容器中的 .net 核心控制台應用程序讀取文本文件

[英]Docker-compose - create a volume and copy text files to it at spin-up and read text files via net core console app in container once running

抱歉,標題有點啰嗦,但我找不到更好的描述方式。 我確定我誤解了圖像和構建容器的概念,但讓我說一下我正在嘗試做的事情,有人可能會澄清我是否有錯誤的一端。

我有一個作為服務運行的控制台應用程序,該應用程序當前在項目中包含許多腳本文件作為嵌入式資源,可以在容器啟動后讀取和操作。 這可以正常工作,但是如果其中一個腳本發生更改,則必須重新編譯和重新部署整個項目。

我想做的是讓我的控制台應用程序在運行時從已知來源讀取腳本文件,即當前項目之外但在容器內的文件夾,這樣我就可以通過 docker-compose 文件創建一個卷並在啟動期間將腳本復制到容器中的目標文件夾。

我正在努力思考如何編寫我的 c# 代碼,以便能夠從特定位置讀取文件,無論應用程序是在容器內運行還是在調試期間在本地運行,這些文件都可以正常工作,我想知道是否也許甚至有可能?

我是不是把這整件事復雜化了?

我一直在玩的一個例子是這樣的

    services:
  consoleapp5:
    image: ${DOCKER_REGISTRY-}consoleapp5
    build:
      context: .
      dockerfile: ConsoleApp5/Dockerfile
    volumes:
      - ./CypherQueries/defaultCypher.txt:/app/cypher/defaultCypher.txt  

現在我在想 '/app' 是容器的根目錄嗎? 所以我想 map 到一個名為“cypher”的文件夾? 在我的應用程序中,我不確定應該如何導航到該目錄,例如

StreamReader sr = new StreamReader("/app/cypher/Sample.txt");

或者

var path = Path.Combine(
    Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location),
    "/app/cypher/Sample.txt");

我知道它們是粗略的例子,但無論如何它們都不會按照我想要的方式工作,是嗎?

無論是否在容器內,我都需要相同的代碼才能工作。

如果我不清楚我要做什么,請告訴我。

非常感謝任何建議。

只要您對路徑進行硬編碼 - 即 /app/cypher/Sample.txt - 問題,您的應用程序是否有效取決於此路徑是否存在以及預期腳本是否實際位於該路徑中。

當你在 map 容器中創建路徑時, Docker 容器中會創建此路徑。 與映像中可能已存在的路徑相比,映射的主機路徑始終具有優先級。 因此,當您的 Docker 圖像已經具有路徑“/app/cypher/defaultCypher.txt”時,它在 docker-compose 向上被遮擋,當它沒有該路徑時,它只是在容器內創建。 雖然這可以確保您的應用程序在容器中運行,但這意味着您必須在希望您的應用程序也運行的每台主機上創建該路徑。

當你想確保你的應用程序在不同主機上工作而無需手動創建路徑時,我的建議是在你的 C# 代碼中使用相對路徑並部署整個 package,或者使用變量組裝路徑並確保將其傳遞給每個環境。

您可以像這樣在 Docker 容器中 map 整個路徑:

volumes:
      - ./CypherQueries:/app/cypher

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM