Подтвердить что ты не робот

Как обновить файл /etc/hosts в изображении Docker во время "сборки докеров"

Я хочу обновить файл /etc/hosts во время сборки docker.

Я добавил строку ниже в файл Docker, но не обновил файл /etc/hosts и не дал никаких ошибок.

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

Мне нужно обновить /etc/hosts. Может ли кто-нибудь предложить на это?

4b9b3361

Ответ 1

В более поздней версии docker это можно сделать с помощью docker-compose и его директивы extra_hosts

Добавьте сопоставления имени хоста.
Используйте те же значения, что и в параметре docker run client --add-host (который уже должен быть доступен для docker 1.8).

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

Вкратце: изменяйте /etc/hosts вашего контейнера при его запуске, а не при его сборке.


С Docker 17. x+ у вас есть docker build --add-host упомянутая ниже, но, как прокомментировано в выпуске 34078 и в этом ответе:

Функция --add-host во время сборки предназначена для переопределения хоста во время сборки, но не для сохранения этой конфигурации в образе.

Упомянутые решения ссылаются на docker-compose, которую я предлагал выше:

  • Запустите внутренний DNS; вы можете установить DNS-сервер по умолчанию для использования в демоне; таким образом, каждый запущенный контейнер будет автоматически использовать настроенный DNS по умолчанию
  • Используйте docker compose и предоставьте docker-compose.yml своим разработчикам.
    Файл компоновки Docker позволяет вам указать все параметры, которые следует использовать при запуске контейнера, чтобы разработчики могли просто составить Docker, чтобы запустить контейнер со всеми параметрами, которые им нужно установить.

Ответ 2

Вы не можете изменить файл хоста в образе, используя echo на шаге RUN потому что демон docker будет поддерживать файл (/etc/hosts) и его содержимое (запись hosts) при запуске контейнера из образа.

Однако для достижения того же самого можно использовать следующее:

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 " ]

Ключевым моментом здесь является использование команды exec как предполагает докерская документация. Использование exec сделает команду java PID 1 для контейнера. Docker прерывания будут только отвечать на это.

См. Https://docs.docker.com/engine/reference/builder/#entrypoint

Ответ 3

Я думаю, что docker недавно добавил флаг --add-host к сборке --add-host что действительно здорово.

[Править] Так что эта функция была обновлена 17.04.0-й

Для получения более подробной информации о том, как использовать docker build --add-host флагом --add-host посетите: https://docs.docker.com/edge/engine/reference/commandline/build/

Ответ 4

Так как это все еще появляется в качестве первого ответа в Google, я внесу возможное решение.

Команда, взятая отсюда, на удивление сработала (Docker 1.13.1, Ubuntu 16.04):

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

Ответ 5

Если это кому-нибудь HOSTALIASES переменная HOSTALIASES env работает для меня:

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

Ответ 6

Я использую AWS Elasticbeanstalk + Docker + Supervisord.

Быстрый ответ

Просто добавьте немного кода в Dockerfile.

CMD echo 123.123.123.123 this_is_my.host >> /etc/hosts; supervisord -n;

Ответ 7

Вы можете сделать с помощью следующей команды во время запуска Docker

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

Здесь я отображаю example.com на localhost 127.0.0.1 и он работает.

Ответ 8

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"
  • Информация
  • пользователь должен su

Ответ 9

После этого я работал, монтируя файл во время запуска docker вместо сборки docker

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

Ответ 10

Просто быстрый ответ для запуска вашего контейнера, используя:

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

после открытия контейнера:

cd ..

затем

`cd etc`

а затем вы можете

cat hosts

или

apt-get update
apt-get vim

или любой редактор, который вам нравится, и откройте его в vim, здесь вы можете изменить свой startup ip до 0.0.0.0