Foreword
My rails app cares about the hostname. So for example when the request comes from domain-a.dev
it behaves differently than when the request comes from domain-b.dev
. I want to test this behaviour and therefore have routed the complete *.dev
TLD to 127.0.0.1
on my local machine, so I can set the domain of the server in my tests to what I want but it always uses my local machine tests server.
This is necessary because my tests use selenium
, which launches an external browser and browses to domain-a.dev
or domain-b.dev
. So I cannot simply overwrite request.hostname
(or so) in my tests, because this has no effect on the external browser.
Now I want to use a docker image for my tests, so I do not have to configure the test environment on multiple servers but simply start the docker image. Everything works so far but the *.dev
resolving.
AFAIK Docker uses the hosts nameserver or google nameserver by default (https://docs.docker.com/articles/networking/#dns), but that would mean to change the host's dns to accomplish my goal which I don't want.
I want to build a docker image, where a special TLD, for example dev
, always routes to 127.0.0.1
, without touching the docker host.
This means that for everybody running this docker image, for example domain.dev
will be resolved to 127.0.0.1
inside the container. (Not only domain.dev
, but every *.dev
domain.). Other TLDs should work as usual.
An idea I have is to start dnsmasq
inside the container, configured to resolve *.dev
to 127.0.0.1
and forward the rest to the usual nameserver. But I am new to docker and have no idea if this is too complicated or how this could be accomplished.
Another idea might be to overwrite /etc/hosts
in the container with fixed entries for special domains. But this would mean I have to update the docker container in case I want to resolve new domains to 127.0.0.1
, which is a drawback if the domains change often.
What do the docker experts say?
I basically worked around this now by using http://xip.io/
By using urls like sub.127.0.0.1.xip.io
I can connect to my local machine. My app only has to know that 127.0.0.1.xip.io
is treated as the "top level domain", and sub
is the domain name without tld. (In a Ruby on Rails app this can be done by adjusting config.action_dispatch.tld_length = 6
for example).