在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套接字到容器中,存在一定安全风险,仅推荐开发环境使用。
操作步骤:
- 修改
docker-compose.yml,给服务添加Docker套接字挂载:
services: master_app: # 其他原有配置不变 volumes: - .:/var/www/laravel-app - /var/run/docker.sock:/var/run/docker.sock # 新增挂载
- 容器内安装Docker客户端后,执行以下命令即可获取当前容器对应的服务名:
docker inspect $(hostname) --format '{{.Config.Labels.com.docker.compose.service}}'
- 在Laravel中可以通过执行shell命令读取该值,再加载对应.env文件即可。
内容的提问来源于stack exchange,提问作者senty
相关产品推荐
相关产品推荐

