![](/img/trans.png)
[英]docker-compose is not setting container_name from environment variable
[英]Access container_name in Dockerfile (from docker-compose)
我已經設置了一個 docker-compose 項目,它正在創建多個圖像:
cache_server:
image: current_timezone/full-supervisord-cache-server:1.00
container_name: renamed-varnish-cache
networks:
- network_frontend
build:
context: "./all-services/"
dockerfile: "./cache-server/Dockerfile.cacheserver.varnish"
args:
- DOCKER_CONTAINER_USERNAME=username
ports:
- "6081:6081"
- "6082:6082"
當我使用docker-compose up -f file1.yml file2.override.yml
我將獲得容器:在上述情況下,它將被命名為: renamed-varnish-cache
在相應的 Dockerfile ( ./nginx-proxy/Dockerfile.proxy.nginx
) 中,我希望能夠使用上面顯示的docker-compose.yml
中定義的container_name
屬性。
創建容器后,我想更新 Dockerfile 內的 Varnish 配置: RUN sed -i "s|webserver_container_name|renamed-varnish-cache|g" /etc/varnish/default.vcl"
例如:
backend webserver_container_name{
.host = "webserver_container_name";
.port = "8080";
}
致:我預計我將不得不將后端的-
替換為_
:
backend renamed_varnish_cache{
.host = "renamed-varnish-cache";
.port = "8080";
}
有沒有辦法接收 docker-compose 命名項目作為Dockerfile 中的變量?
在核心 Docker 中,有兩個獨立的概念。 映像是某些軟件及其依賴項打包在一起的構建版本; 容器是圖像的運行實例。 有單獨的docker build
和docker run
命令來構建鏡像和啟動容器,您可以從單個鏡像啟動多個容器。
Docker Compose 包裝了這些概念。 特別是build:
塊對應於 image-build 步驟,這就是調用 Dockerfile 的內容。 Dockerfile 中沒有其他 Compose 選項可用或可見。 您無法訪問container_name:
或environment:
variables 或volumes:
因為它們在構建生命周期中此時不存在; 您也無法從 Dockerfile 內部聯系其他 Compose 服務。
如果多個容器具有基本相同的代碼庫但需要不同的頂級命令,那么讓多個容器從同一個映像運行是很常見的。 一個例子是 Python Django 應用程序需要 Celery 后台工作程序; 您將擁有相同的項目結構,但 Celery 工作人員的命令不同。
version: '3.8'
services:
web:
build: .
image: my/django-app
worker:
image: my/django-app
command: celery worker ...
現在使用此堆棧,您可以docker-compose build
以構建一個映像,然后運行docker-compose up
以從該映像啟動兩個容器。 (在構建期間,您無法知道容器名稱是什么,並且會有兩個容器名稱,因此您不能只在 Dockerfile 中使用一個。)
在設計級別,這意味着您通常不能在映像本身中包含配置類型設置(其他容器的主機名、主機共享文件系統的用戶 ID)。 如果您的應用程序允許您將這些內容指定為環境變量,那么這是最簡單的選擇。 您可以使用綁定掛載 ( volumes:
:) 來注入整個配置文件。 如果這些都不適合您,您可以使用入口點腳本來重寫配置文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.