[英]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.