我已经设置了一个 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
) 中,我希望能够使用 container_name
docker-compose.yml
中定义的属性如上所示。创建容器后,我想更新 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";
}
有没有办法在 Dockerfile 中接收 docker-compose 命名项目作为变量?
最佳答案
在核心 Docker 中,有两个独立的概念。镜像是某些软件及其依赖项打包在一起的构建版本;容器是图像的运行实例。有单独的docker build
和 docker run
构建镜像和启动容器的命令,您可以从单个镜像启动多个容器。
Docker Compose 包装了这些概念。特别是 build:
block 对应于镜像构建步骤,这就是调用 Dockerfile 的内容。 Dockerfile 中没有其他 Compose 选项可用或可见。 您无法访问 container_name:
或 environment:
变量或 volumes:
因为这些在构建生命周期的这一点上不存在;您也无法从 Dockerfile 中联系其他 Compose 服务。
如果多个容器具有基本相同的代码库但需要不同的顶级命令,那么让多个容器运行同一个镜像是很常见的。一个例子是需要 Celery 后台工作人员的 Python Django 应用程序;您将拥有相同的项目结构,但 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)。如果您的应用程序允许您将这些内容指定为环境变量,那么这是最简单的选择。您可以使用绑定(bind)挂载 (
volumes:
) 来注入(inject)整个配置文件。如果这些都不适合你,你可以use an entrypoint script to rewrite the config file .
关于docker - 访问 Dockerfile 中的 container_name(来自 docker-compose),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63411403/