Prakash
Prakash

Reputation: 2772

How to update /etc/hosts file in Docker image during "docker build"

I want to update my /etc/hosts file during "docker build".

I added below line in Dockerfile but it's neither updating /etc/hosts file nor giving any error.

RUN echo "192.168.33.11    mynginx" >> /etc/hosts

I need to update /etc/hosts. Can anyone suggest on this?

Upvotes: 207

Views: 333529

Answers (11)

VonC
VonC

Reputation: 1323025

With a more recent version of docker, this could be done with docker-compose and its extra_hosts directive

Add hostname mappings.
Use the same values as the docker run client --add-host parameter (which should already be available for docker 1.8).

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

In short: modify /etc/hosts of your container when running it, instead of when building it.


With Docker 17.x+, you have a docker build --add-host mentioned below, but, as commented in issue 34078 and in this answer:

The --add-host feature during build is designed to allow overriding a host during build, but not to persist that configuration in the image.

Those links point to strategies for dealing with the problem at hand:

  • Run an internal DNS; you can set the default DNS server to use in the daemon; that way every container started will automatically use the configured DNS by default
  • Use docker compose and provide a docker-compose.yml to your developers.
    The docker compose file allows you to specify all the options that should be used when starting a container, so developers could just docker compose up to start the container with all the options they need to set.

These solutions can take advantage of using of the docker-compose method that was suggested earlier in the answer, with its extra_hosts directive.

Upvotes: 265

Remy
Remy

Reputation: 151

Since this still comes up as a first answer in Google I'll contribute possible solution.

Command taken from here suprisingly worked for me (Docker 1.13.1, Ubuntu 16.04) :

docker exec -u 0 <container-name> /bin/sh -c "echo '<ip> <name>' >> /etc/hosts"

Upvotes: 15

Kandy
Kandy

Reputation: 388

I just created a sh script and run it on start docker.

In this script I start all the services and update the hosts file:

on Dockerfile:

CMD /tmp/init_commands.sh & sleep infinity 

init_comands.sh

any other commands...
echo "192.168.11.5    XXXXXXX" >> /etc/hosts
echo "192.168.11.6    XXXXXXY" >> /etc/hosts
echo "192.168.11.7    XXXXXXZ" >> /etc/hosts

Upvotes: 0

Karan Raj
Karan Raj

Reputation: 442

You can use the --add-host option during docker run.

For your case use: docker run --add-host mynginx:192.168.33.11 [image_name]:[tag]

This will update your /etc/hosts

you can check it by using following commands:

  • docker exec -it [container_id] sh

if sh doesnt work for you ,then you can try bash or /bin/sh or /bin/bash

  • cat /etc/hosts

Upvotes: 6

Asad Shakeel
Asad Shakeel

Reputation: 2285

You can do with the following command at the time of running docker

docker run [OPTIONS] --add-host example.com:127.0.0.1 <your-image-name>:<your tag>

Here I am mapping example.com to localhost 127.0.0.1 and its working.

Upvotes: 12

Name Last
Name Last

Reputation: 17

Tis is me Dockefile
FROM XXXXX
ENV DNS_1="10.0.0.1 TEST1.COM"
ENV DNS_1="10.0.0.1 TEST2.COM" 
CMD ["bash","change_hosts.sh"]`

#cat change_hosts.sh
su - root -c "env | grep DNS | akw -F "=" '{print $2}' >> /etc/hosts"
  • info
  • user must su

Upvotes: -1

user10805445
user10805445

Reputation: 51

If this is useful for anyone, the HOSTALIASES env variable worked for me:

echo "fakehost realhost" > /etc/host.aliases
export HOSTALIASES=/etc/host.aliases

Upvotes: 5

Shubham Singh
Shubham Singh

Reputation: 976

You can not modify the host file in the image using echo in RUN step because docker daemon will maintain the file(/etc/hosts) and its content(hosts entry) when you start a container from the image.

However following can be used to achieve the same:

ENTRYPOINT ["/bin/sh", "-c" , "echo 192.168.254.10   database-server >> /etc/hosts && echo 192.168.239.62   redis-ms-server >> /etc/hosts && exec java -jar ./botblocker.jar " ]

Key to notice here is the use of exec command as docker documentation suggests. Use of exec will make the java command as PID 1 for the container. Docker interrupts will only respond to that.

See https://docs.docker.com/engine/reference/builder/#entrypoint

Upvotes: 42

Bill Cheng
Bill Cheng

Reputation: 742

I think docker recently added the --add-host flag to docker build which is really great.

[Edit] So this feature was updated on 17.04.0-ce

For more detail on how to use docker build with the --add-host flag please visit: https://docs.docker.com/edge/engine/reference/commandline/build/

Upvotes: 29

Esk Aie
Esk Aie

Reputation: 7

Just a quick answer to run your container using:

docker exec -it <container name> /bin/bash

once the container is open:

cd ..

then

`cd etc`

and then you can

cat hosts

or:

apt-get update
apt-get vim

or any editor you like and open it in vim, here you can modify say your startup ip to 0.0.0.0

Upvotes: -19

user6709748
user6709748

Reputation:

Following worked for me by mounting the file during docker run instead of docker build

docker service create --name <name>  --mount type=bind,source=/etc/hosts,dst=/etc/hosts   <image>

Upvotes: -2

Related Questions