docker RUN присоединяется к /etc/hosts в Dockerfile, не работает

У меня есть простой файл Docker, но первая команда RUN (для добавления IP-адреса хоста в /etc/hosts) не имеет никакого эффекта

FROM dockerfile/java
RUN sudo echo "XX.XX.XXX.XXX some.box.com MyFriendlyBoxName" >> /etc/hosts
ADD ./somejavaapp.jar /tmp/
#CMD java -jar /tmp/somejavaapp.jar
EXPOSE 8280

Я использую

docker build .

а затем проверить, что эхо-строка RUN работает с использованием

sudo docker run -t -i <built image ID> /bin/bash

Я попал в контейнер, но файл /etc/hosts не был добавлен. Выполнение того же эха.... строка, пока в контейнере имеет желаемый эффект

Может ли кто-нибудь сказать мне, что не так с моим файлом dockerfile RUN...?

Ответы

Ответ 1

Docker будет генерировать /etc/hosts динамически каждый раз, когда вы создаете новый контейнер. Так что это может связать других. Вы можете использовать опцию --add-host :

docker run --add-host www.domain.com:8.8.8.8 ubuntu ping www.domain.com

Ответ 2

Если вы используете docker-compose, используйте extra_hosts:

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

Ответ 3

Если вы пытаетесь сохранить записи файлов хостов между хост-машиной и контейнером, другой способ заключается в том, чтобы обернуть вашу команду сценарием оболочки, который отображает хосты /etc/hosts в параметры --add-host:

~/bin/java:

#!/bin/sh

ADD_HOSTS=$(tail -n +10 /etc/hosts | egrep -v '(^#|^$)' | sed -r 's/^([a-z0-9\.\:]+)\s+(.+)$/--add-host="\2:\1"/g')

eval docker run \
    -it \
    --rm \
    $ADD_HOSTS \
    <image> \
    java $*

return $?

Очевидно, замените java тем, что вы пытаетесь сделать...

Объяснение; ADD_HOSTS займет все после первых 10 строк в /etc/hosts | удалить комментарии и пустые строки | --add-host записи в параметры --add-host.

Причиной принятия всего после первых 10 строк является исключение записей localhost и ipv6 для вашей главной машины. Возможно, вам придется настроить это в соответствии с вашими потребностями.