如何解决在Dockerfile中访问container_name来自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
)中,我希望能够使用上面显示的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";
}
有没有办法将docker-compose命名项作为Dockerfile中的变量接收?
解决方法
在核心Docker中,有两个独立的概念。 image 是与其相关性打包在一起的某些软件的构建版本。 容器是图像的运行实例。有单独的docker build
和docker run
命令来构建映像并启动容器,您可以从一个映像中启动多个容器。
Docker Compose包装了这些概念。特别地,build:
块对应于映像构建步骤,这就是调用Dockerfile的步骤。 其他Compose选项在Dockerfile中都不可用或不可见。您无法访问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)。如果您的应用程序允许您将这些内容指定为环境变量,那是最简单的选择。您可以使用绑定装载(volumes:
)注入整个配置文件。如果这些都不适合您,则可以use an entrypoint script to rewrite the config file。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。