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


107

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

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

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

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


Вы используете boot2docker для выполнения сборки докера?
VonC

Нет, я использую версию docker 1.8 для Linux.
Prakash

1
А когда вы запускаете свой образ как контейнер, его / etc / hosts не изменяется? Или вы имели в виду свой хост Linux / etc / hosts?
VonC

4
Во время сборки docker образ создается успешно. Но когда я запустил контейнер с тем же образом и проверил файл / etc / hosts, изменений не было.
Prakash

Ответы:


142

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

Добавьте сопоставления имен хостов.
Используйте те же значения, что и параметр docker runклиента--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 compose позволяет указать все параметры, которые следует использовать при запуске контейнера, поэтому разработчики могут просто создать docker compose, чтобы запустить контейнер со всеми параметрами, которые им нужно установить.

2
я хочу изменить / etc / hosts в образе докера.
Prakash

1
@PrakashSingh Я согласен, но сделать это непросто.
VonC

1
@PrakashSingh Вы можете открыть экземпляр bash на машине с помощью docket exec -it <container name> /bin/bash, а затем обновить хост контейнера докера в / ect / host с помощью предпочитаемого редактора командной строки (vim, emacs, nano, echo ''. >> />).
NateAGeek

@PrakashSingh Да, мы можем (звучит знакомо ...). Но это просто похоже на хакерский прием для Docker, когда мы меняем запись хостов путем создания образа, а не запуска контейнера. Дизайн сети Docker управляется приложениями (с сайта docker.com). Поскольку запись hosts является частью сети докеров, нам лучше определить ее при запуске контейнера из образа. Если вам действительно нужно добавить несколько записей о хостах, вы не добавляете их, создавая образ каждый раз, вы добавляете их в базовый образ один раз. Это лучшая практика.
Light.G 08

2
Чтобы решить проблему с пакетами rocker / shiny install.packages во время сборки докеров, --add-host: cran.rstudio.com: <IPaddress> решил проблему для меня.
bvanlew

25

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

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

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


ты! это отличное решение
xero

1
Если вы ищете решение kubenetes, вы можете использовать hostAliases. kubernetes.io/docs/concepts/services-networking/… точно так же, как docker создает extra_hosts.
Шубхам Сингх

Точнее ENTRYPOINTэто не инструкция по изображению. Он отмечает точку входа только тогда, когда мы запускаем контейнер из этого образа, что означает, что запись hosts существует только после запуска контейнера. Я не считаю это требование существенным. Должно быть какое-то недоразумение.
Light.G 08

17

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

[Edit] Итак, эта функция была обновлена 17.04.0-ce

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


1
Эта --add-hostфункция доступна в Docker 12 в CentOS.
chutz

1
Я хочу подчеркнуть, что «хост, добавленный с этим флагом, используется только во время сборки; он намеренно не должен сохраняться в образе» github.com/moby/moby/issues/34078
Sida Zhou

10

Поскольку это все еще является первым ответом в Google, я предлагаю возможное решение.

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

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

Не актуально, но все же ценно. Спасибо.
Light.G

4

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

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

3
не путаете ли вы докер с кубернетами? Я не вижу никаких переменных HOSTALIASES в документации докеров
Адриан Лемер

4

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

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

Здесь я сопоставляю example.comlocalhost 127.0.0.1и его работу.


3

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

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

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

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

1

Полный ответ

  1. Подготовьте свой собственный hostsфайл, который вы хотите добавить в контейнер докера;
1.2.3.4 abc.tv
5.6.7.8 domain.xyz
1.3.5.7 odd.org
2.4.6.8 even.net
  1. Скопируйте hostsфайл в контейнер, добавив следующую строку вDockerfile
COPY hosts /etc/hosts_extra
  1. Если вы знаете, как использовать ENTRYPOINTor CMDor CRONjob, включите в него следующую командную строку или, по крайней мере, запустите ее внутри работающего контейнера:
cat /etc/hosts_extra >> etc/hosts;
  1. Вы не можете добавить следующее в Dockerfile потому что модификация будет потеряна:
RUN cat /etc/hosts_extra >> etc/hosts;

0

Вы можете использовать --add-host во время запуска докера.

В вашем случае используйте: docker run --add-host mynginx: 192.168.33.11 [image_name]: [tag]

Это обновит ваш / etc / hosts

вы можете проверить это, используя следующие команды:

  • docker exec -it [идентификатор_контейнера] sh

если sh не работает, вы можете попробовать bash или / bin / sh или / bin / bash

  • cd и т. д.
  • кошачьи хозяева

-1
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

-2

Следующее сработало для меня, установив файл во время запуска докера вместо сборки докера

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

добавление файла с использованием тома создает дополнительную сложность, и файл должен быть у каждого хоста.
Shubham Singh

-11

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

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

как только контейнер открыт:

cd ..

затем

`cd etc`

и тогда вы можете

cat hosts

или:

apt-get update
apt-get vim

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.