Using --add-host or extra_hosts with docker-compose
DockerHostsDocker ComposeDocker Problem Overview
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?
Docker Solutions
Solution 1 - Docker
I have great news: this will be in Compose 1.3!
I'm using it in the current RC (RC1) like this:
rng:
build: rng
extra_hosts:
seed: 1.2.3.4
tree: 4.3.2.1
Solution 2 - Docker
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
Solution 3 - Docker
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
Solution 4 - Docker
It seems like it should be made possible to say:
extra_hosts:
- "loghost:localhost"
So if the part after the colon (normally an IP address) doesn't start with a digit, then name resolution will be performed to look up an IP for localhost, and add something like to the container's /etc/hosts:
127.0.0.1 loghost
...assuming that localhost resolves to 127.0.0.1 on the host system.
It looks like it'd be really easy to add in docker-compose's source code: compose/config/types.py's parse_extra_hosts function would likely do it.
For docker itself, this would probably be addable in opts/hosts.go's ValidateExtraHost function, though then it's not strictly validating anymore, so the function would be a little misnamed.
It might actually be a little better to add this to docker, not docker-compose - docker-compose might just get it automatically if docker gets it.
Sadly, this would probably require a container bounce to change an IP address.