[英]Access a docker network during build of docker-compose v2?
有一個docker-compose.yml
文件來構建這樣的圖像:
services:
my-service:
build:
context: My.VS.AppFolder
networks:
- my-docker
networks:
my-docker:
external: true
定義的網絡僅在ENTRYPOINT
中可用。 但不是在構建期間。 如何在構建Dockerfile
期間訪問同一網絡my-docker
docker 上的另一個容器?
我有一個 ASP.NET 核心 MVC 2.1 web 應用程序。 為了更好地分離關注點,我想在另一個單獨的 web 應用程序(例如管理界面)中實現某些功能。 為了避免復制應用程序布局 (Razor) 或一些輔助實用程序類等共享內容,我為這些內容創建了一個共享項目。
所以現在有三個項目:
由於MyApp.Core需要從其他項目中引用,因此我將BaGet 安裝為簡單的 NuGet 托管存儲庫,用於我的 docker 構建環境。 此容器在nuget.config
中使用其 DNS 名稱進行內部引用,在MyApp
的解決方案級別創建(在新的MyApp.Admin
上相同,但為了簡單起見,讓我們專注於MyApp
)。
在MyApp
的Dockerfile
中,我現在正在這樣做:
RUN dotnet restore --configfile nuget.config
並且需要訪問my-docker
docker 網絡上名為baget
的 dns 名稱。 研究表明,這只有在docker-compose
的至少 3.4 版才有可能,而且似乎還沒有正式記錄。 但是Docker 從 v3 的 v2 中刪除了幾個選項,例如我正在使用的mem_limits
等資源限制。 從 v3 開始,它們僅可使用 swarm,不再適用於單個節點。
所以我目前沒有看到除了遷移到 v3 和 swarm 之外的任何解決方案,這會導致額外的工作和復雜性,除了這個網絡問題之外沒有其他好處。 我的項目並不需要swarm那么大。
我發現了兩種解決此問題的方法:
docker
cli 工具而不是docker-compose
我沒有使用docker-compose up -d --build
,而是使用 dockers CLI 工具手動構建映像,因為它有一個--network
開關,允許在構建期間指定網絡:
docker build --network my-docker -t my-service:latest --build-arg ASPNETCORE_ENVIRONMENT=Development My.VS.AppFolder
現在在docker-compose.yml
中引用這個圖像,而不是在那里構建它:
services:
my-service:
image: my-service:latest
構建映像后,在不帶--build
標志的情況下運行docker-compose up -d
。 這會導致一些開銷,因為您必須進行 CLI 調用,並且對於像alpine-3.2.1
這樣的真正標記,需要使用 env 變量指定此標記並傳遞給 docker/docker-compose。 但它似乎是生產使用的最佳替代方案。
自docker-compose
起,docker-compose 中有一個--compatibility
開關,允許使用新的 v3 文件版本,但 map 群選項,如資源限制到本地 v2 形式。 換句話說:您可以在 v3 中使用指定的ressources
,並且在使用此開關時它們適用於docker-compose
。 否則,它們將在docker-compose
上被忽略,並且僅對docker stack deploy
有效。
因此,使用此開關,您可以從構建期間定義網絡的能力中受益,而不會失去資源限制。 但是文檔警告說,這對於生產性使用來說不夠穩定:
我們建議不要在生產中使用 --compatibility 模式。 由於生成的配置只是使用非 Swarm 模式屬性的近似值,因此可能會產生意想不到的結果。
出於這個原因,我不認為它是一個真正的解決方案,而是使用第一種使用 dockers CLI 構建圖像的方法,其中可以指定網絡。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.