Як оновити / etc / hosts файл у зображенні Docker під час "docker build"


106

Я хочу оновити свій /etc/hostsфайл під час "docker build".

Я додав нижче рядка в Dockerfile, але це ні оновлення /etc/hostsфайлу, ні помилка.

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

Мені потрібно оновити /etc/hosts. Хтось може запропонувати з цього приводу?


Чи використовуєте ви boot2docker для виконання збірки докера?
VonC

Ні, я використовую версію Linux docker 1.8.
Пракаш

1
І коли ви використовуєте зображення як контейнер, його / etc / hosts не змінюється? Або ви посилалися на свій хост / etc / hosts Linux?
VonC

4
Під час збирання докера зображення будується успішно. Але коли я запускаю контейнер, використовуючи одне і те ж зображення, і я перевіряв / etc / hosts файл, змін там не було.
Пракаш

Відповіді:


141

З новітньою версією докера це можна зробити за допомогою docker-compose та його extra_hostsдирективи

Додайте відображення імен хоста.
Використовуйте ті самі значення, що і параметр docker runклієнта--add-host (який вже повинен бути доступний для докера 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Особливість в процесі побудови розроблена , щоб дозволити перевизначення господаря під час збирання, але не зберігати цю конфігурацію в зображенні.

Згадані рішення стосуються докер-композиції, яку я пропонував вище:

  • Запустити внутрішній DNS; ви можете встановити сервер DNS за замовчуванням для використання в демон; таким чином кожен запущений контейнер автоматично використовуватиме налаштований DNS за замовчуванням
  • Використовуйте docker-композицію та надайте docker-compose.ymlсвоїм розробникам.
    Файл композиції docker дозволяє вказати всі параметри, які слід використовувати під час запуску контейнера, тому розробники можуть просто докер створити, щоб запустити контейнер з усіма параметрами, які їм потрібно встановити.

2
я хочу змінити / etc / hosts у зображенні докера.
Пракаш

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). Оскільки запис хостів є частиною докерської мережі, то краще визначити його під час запуску контейнера із зображення. Якщо вам дійсно потрібно додати деякі записи хостів, ви не додаєте їх, будуючи зображення щоразу, ви додаєте їх до базового зображення один раз. Це найкраща практика.
Світло.Г

2
Щоб вирішити проблему з rocker / shiny install.packages під час збирання докера --add-host: cran.rstudio.com: <IPadress> вирішив проблему для мене.
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 для контейнера. Докер переривання відповість лише на це.

Див. Https://docs.docker.com/engine/reference/builder/#entrypoint


ти! це чудове рішення
xero

1
Якщо ви шукаєте рішення kubenetes, ви можете використовувати hostAliases. kubernetes.io/docs/concepts/services-networking/… так само, як докер створює extra_hosts.
Shubham Singh

Точніше, ENTRYPOINTце не інструкція до зображення. Він позначає точку входу лише тоді, коли ми запускаємо контейнер із цього зображення, а це означає, що запис хостів існує лише після запуску контейнера. Я не думаю, що вимога є суттєвою. Має бути якесь непорозуміння.
Світло.Г

17

Я думаю, що докер нещодавно додав --add-hostпрапор до docker-збірки, що справді чудово.

[Редагувати] Отже, ця функція була оновлена 17.04.0-се

Більш докладно про те , як використовувати 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/isissue/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"

Не актуально, але все-таки цінно. Дякую.
Світло.Г

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. Якщо ви знаєте , як використовувати ENTRYPOINTабо CMDчи CRONзавдання потім включити наступну командний рядок в нього або , по крайней мере , запустити цей всередині контейнера працює:
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 [контейнер_id] ш

якщо 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"
  • інформація
  • користувач повинен су

-2

Слідом працював для мене, монтуючи файл під час запуску docker замість збірки докера

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.