219

I am using docker-compose to run a test environment, that consists of about 5 different containers. The inter-container links and the shared volumes (volumes-from) works wonderfully. I also expose some ports up to the host machine, which works nicely.

What I am missing is a way to link some of my real servers into this environment, without hardcoding ip address. With docker run, you could use --add-host to add another line in your /etc/hosts file. Is there any way to do something similar with docker-compose?

3 Answers 3

203

https://github.com/compose-spec/compose-spec/blob/master/spec.md#extra_hosts

extra_hosts - Add hostname mappings. Uses the same values as the docker client --add-host parameter.

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

An entry with the ip address and hostname will be created in /etc/hosts > inside containers for this service, e.g:

162.242.195.82  somehost
50.31.209.229   otherhost
Sign up to request clarification or add additional context in comments.

6 Comments

Not supported on build
How can I map an external name (not an IP) to a container alias?
You mean set a hostname? -h HOSTNAME docs.docker.com/engine/userguide/networking/default_network/… Or use an alias in docker-compose: docs.docker.com/compose/compose-file/#aliases
extra_hosts appears to be supported as an undocumented subkey of build, at least on compose 2.4.1.
It should be also supported on build now: github.com/compose-spec/compose-spec/blob/master/…
|
151

This works still docker-compose 1.3 with extra_hosts parameter:

rng:
  build: rng
  extra_hosts:
    seed: 1.2.3.4
    tree: 4.3.2.1

4 Comments

For any one finding this to error out saying unsupported config directive "extra-hosts" it's not "extra-hosts" it's "extra_hosts".
The format here, of a nested dictionary, is out of date. This answer stackoverflow.com/a/61231167/1497199 is more up to date.
@Dave No, it is NOT out of date. If you should have the wrong format, docker-compose will tell you: services.imageproxy.extra_hosts contains an invalid type, it should be an object, or an array. And object is one of two options. Far preferrable to a string, IMHO.
i have added this extra_hosts: - "host.docker.internal:host-gateway" but still it is saying in logs that connection refused
133

Basic docker-compose.yml with extra hosts:

version: '3'
services:
api:
    build: .
    ports:
        - "5003:5003"
    extra_hosts:
        - "your-host.name.com:162.242.195.82" #host and ip
        - "your-host--1.name.com your-host--2.name.com:50.31.209.229" #multiple hostnames with same ip
        

The content in the /etc/hosts file in the created container:

162.242.195.82  your-host.name.com
50.31.209.229   your-host--1.name.com your-host--2.name.com

You can check the /etc/hosts file with the following commands:

$ docker-compose -f path/to/file/docker-compose.yml run api bash  # 'api' is service name
#then inside container bash
root@f7c436910676:/app# cat /etc/hosts

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.