首页 > 解决方案 > 使用 URL 而不是服务名称通过 docker compose 连接服务

问题描述

我有以下 docker-compose 文件:

# For more information: https://laravel.com/docs/sail
version: '3'
services:
    login:
        build:
            context: ${LOGIN}/vendor/laravel/sail/runtimes/8.0
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.0/app
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
            XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
            XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
        volumes:
            - '${LOGIN}:/var/www/html'
        networks:
            - sail
        depends_on:
            - mysql
    companies:
        build:
            context: ${COMPANIES}/vendor/laravel/sail/runtimes/8.0
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.0/app
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
            XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
            XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
        volumes:
            - '${COMPANIES}:/var/www/html'
        networks:
            - sail
        depends_on:
            - mysql
    mysql:
        image: 'mysql:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
        volumes:
            - 'sailmysql:/var/lib/mysql'
        networks:
            - sail
        healthcheck:
          test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
          retries: 3
          timeout: 5s
    webserver:
        image: 'nginx:alpine'
        volumes:
            - '${NGINX_CONFIG}:/etc/nginx/conf.d'
            - '${NGINX_CONFIG}/certs/:/etc/nginx/ssl'
        ports:
            - 80:80
            - 443:443
        networks:
            - sail
        depends_on:
            - login
            - companies
networks:
    sail:
        driver: bridge
volumes:
    sailmysql:
        driver: local

login服务用于 OAuth 流程(Laravel 护照/社交名流)companies

我遇到的问题是重定向中断,因为某些环境变量需要login服务名称才能在内部 docker 网络中发送发布请求,但是浏览器重定向需要完整的 url ( https://login.test )。

有问题的 .env 变量是:

LARAVEL_PASSPORT_HOST=login

有没有办法https://login.test在内部 docker 网络中使用完整的 url?

标签: laraveldockerdocker-composelaravel-passportlaravel-sail

解决方案


了解如何使用网络别名

对于您的上下文中的一个快速示例:

    login:
        build:
            context: ${LOGIN}/vendor/laravel/sail/runtimes/8.0
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.0/app
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
            XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
            XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
        volumes:
            - '${LOGIN}:/var/www/html'
        networks:
            sail:
              aliases:
                - login.test
        depends_on:
            - mysql

现在sail网络中的所有机器都可以login使用服务名称或别名来访问该服务login.test。根据需要添加任意数量。


推荐阅读