docker - 访问 Dockerfile 中的 container_name(来自 docker-compose)

标签 docker docker-compose dockerfile

我已经设置了一个 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 builddocker 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/

相关文章:

sql-server - 在Windows容器内连接到MS SQLServer上的“The semaphore timeout period has expired”

docker - Docker Compose中具有可变主机位置的卷

node.js - Dockerfile env 依赖的起点

node.js - 构建 Node 镜像: Error response from daemon: dockerfile parse error line 15: unknown instruction: CMD ["NODE",

node.js - 在开始我的项目之前,我首先需要 docker 环境吗?

docker - 如果我在Dockerfile中使用env var,那么env var是否烘焙到镜像中?

macos - 在本地OSX上丢失数据docker gitlab

docker - 当主机不正常关闭时,docker 容器中的文件会发生什么?

docker - 在Dockerfile中复制?