Resolve container name in extra_hosts option in docker-compose

I solved this kind of issue by using links instead of extra_hosts.

In that case, just set link alias can do your favor.

service fpm setting
links
  - nginx:myapi.docker

See docker-compose links documentation, The alias name can be the domain which appears in your code.


Add network aliases in the default network.

version: "3.7"
services:

  nginx:
    # ...
    networks:
      default:
        aliases:
          - example.local

  browser-sync:
    # ...
    depends_on:
      - nginx
    command: "browser-sync start --proxy http://example.local"

services:
  nginx:
    build:
    context: .
    dockerfile: ./docker/nginx/Dockerfile
    volumes:
      - ./docker/nginx/conf/dev/api.conf:/etc/nginx/conf.d/default.conf
    ports:
      - 8080:80
    networks:
      my_network:
        aliases:
          - myapi.docker
          - docker_my_network
  fpm:
    build:
    context: .
    dockerfile: ./docker/fpm/Dockerfile
    volumes:
      - .:/var/www/html
      - ./docker/fpm/conf/dev/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
      - ./docker/fpm/conf/dev/api.ini:/usr/local/etc/php/conf.d/api.ini
    env_file:
      - ./docker/mysql/mysql.env
      - ./docker/fpm/conf/dev/fpm.env
    links:
      - mysql
    shm_size: 256M
    networks:
      - my_network

  networks:
    my_network:
      driver: bridge
  • add custom network and add container to that network
  • by default if you curl nginx container from fpm you will curl localhost, so we need to add alias to be the same as your servername in the nginx configuration
  • with this solution you can curl myapi.docker from the fpm container

@edward let me know if this solution worked for you

Edit: Jack_Hu is right, I removed extra_hosts. Network alias is enough.