In a project recently I had a need to add an entry to
/etc/hosts and being new to Docker I was surprised to find that hosts is read only. Turns out this is a known issue, but I was able to find a work around. Essentially creating a copy of the library that handles hostname resolution and editing it to replace /etc/hosts with the path of a writable hosts file. Sounds daunting but it isn’t all that scary, here’s the step by step:- Create a writable copy of
/etc/hostssomewhere where the path will be the same length. I used/tmp/hosts:RUN cp /etc/hosts /tmp/hosts - Then you need to make a copy of
libnss_files.sothat you can edit:RUN mkdir -p -- /lib-override && cp /lib/x86_64-linux-gnu/libnss_files.so.2 /lib-override - Now edit the binary to replace
/etc/hostswith the path to the writablehostsfile (ex./tmp/hosts):RUN perl -pi -e 's:/etc/hosts:/tmp/hosts:g' /lib-override/libnss_files.so.2 - Finish up by letting the system know where to find the edited binary:
ENV LD_LIBRARY_PATH /lib-override RUN echo '127.0.0.1 ola' >> /tmp/hosts