You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Docker容器内部如何获取docker-compose定义的服务名称?

解决方案

方案1:显式注入服务名环境变量(优先推荐)

这是兼容性最高、实现最简单的方案,同时支持Web请求和CLI场景,无额外依赖和安全风险。
你只需要修改docker-compose.yml,给每个服务添加environment配置,手动传入服务名称即可:

version: '3.8'
services:
    master_app:
        build:
            context: ./docker/app
            dockerfile: Dockerfile
        image: my-image/app
        ports:
            - "50000:80"
        volumes:
            - .:/var/www/laravel-app
        networks:
            - laranet-net
        # 新增环境变量注入
        environment:
            - SERVICE_NAME=master_app
    slave_app_1:
        build:
            context: ./docker/app
            dockerfile: Dockerfile
        image: my-image/app
        ports:
            - "80"
        volumes:
            - .:/var/www/laravel-app
        networks:
            - lara-net
        # 新增环境变量注入
        environment:
            - SERVICE_NAME=slave_app_1

修改完成后重启容器,即可在Laravel代码中读取该环境变量,加载对应的配置文件。你可以在bootstrap/app.php中添加以下逻辑:

<?php
// 其他初始化逻辑...

$serviceName = getenv('SERVICE_NAME');
if ($serviceName && file_exists(__DIR__ . "/../.env.{$serviceName}")) {
    $app->loadEnvironmentFrom(".env.{$serviceName}");
}

方案2:通过Docker元数据自动获取服务名

如果不想手动为每个服务配置环境变量,可以通过读取Docker自身的元数据获取服务名,该方案需要挂载Docker套接字到容器中,存在一定安全风险,仅推荐开发环境使用。

操作步骤:

  1. 修改docker-compose.yml,给服务添加Docker套接字挂载:
services:
    master_app:
        # 其他原有配置不变
        volumes:
            - .:/var/www/laravel-app
            - /var/run/docker.sock:/var/run/docker.sock # 新增挂载
  1. 容器内安装Docker客户端后,执行以下命令即可获取当前容器对应的服务名:
docker inspect $(hostname) --format '{{.Config.Labels.com.docker.compose.service}}'
  1. 在Laravel中可以通过执行shell命令读取该值,再加载对应.env文件即可。

内容的提问来源于stack exchange,提问作者senty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:51:03