Dockerfile как добавить псевдоним локального хоста

#docker

#docker

Вопрос:

Dockerfile как добавить псевдоним локального хоста?

Привет, мне нужно добавить localhost псевдоним в Dockerfile я делаю следующее:

RUN echo '127.0.0.1 locdev' >> /etc/hosts

Но когда я затем перехожу к консоли загрузки изображений

 $ docker exec -it my-image bash
  

и попробуйте пропинговать этот хост, он выдает ошибку

 $ ping locdev
ping: unknown host
  

Что /etc/hosts содержит?

 $ cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.4  62a5e2d10730
  

других записей нет

Кто-нибудь знает, как я могу это сделать? Мне нужно сделать это в Dockerfile качестве внешней службы, запускающей этот docker, и я не запускаю его из командной строки.

В моем случае это PHP приложение, которое хранится в Bitbucket репозитории. Появилась новая функция PIPELINES . Он запускает сборку приложения на Docker изображении.

В моем случае это приложение подключается к mysql серверу, на котором я не могу изменить конфигурацию (это приведет к остановке производства). На этом образе docker я настроил mysql сервер. Так localhost работает, но мне нужно добавить этот псевдоним localhost , чтобы не нарушать работу производственного сервера;

Dockerfile фрагмент:

 RUN 
 aliases="127.0.0.1 localhost locdev" amp;amp;
 sed "1s/.*/$aliases/" /etc/hosts
RUN cat /etc/hosts
  

Мой docker build пример вывода:

 Step 10 : RUN aliases="127.0.0.1 localhost locdev" amp;amp; sed "1s/.*/$aliases/" /etc/hosts
 ---> Running in 11ac105d632d
127.0.0.1 localhost locdev
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      383850eeb47b
 ---> 0248977e48bd
Removing intermediate container 11ac105d632d
Step 11 : RUN cat /etc/hosts
 ---> Running in 20fc2f40b5a9
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      383850eeb47b
 ---> c9e47ee296c5
Removing intermediate container 20fc2f40b5a9
Successfully built c9e47ee296c5
  

Комментарии:

1. Смотрите unix.stackexchange.com/questions/102660 /… у вас не должно быть нескольких строк, указывающих на 127.0.0.1. Вы должны изменить существующую строку localhost, добавив псевдоним

2. Но /etc/host содержит только ту запись, которую я добавил

3. Это должно быть /etc/hosts (обратите внимание s на конец)

4. поэтому он не работает с hosts файлом, он остается неизменным.

Ответ №1:

Поскольку Docker управляет /etc/hosts файлом за вас, внесение изменений в /etc/hosts него не сработает.

Однако вы можете добавить дополнительные хосты в обнаружение службы DNS Docker с --add-host помощью опции при запуске docker create или docker run .

Это из выходных данных docker run --help :

   --add-host value              Add a custom host-to-IP mapping (host:ip) (default [])
  

Однако имейте в виду, что 127.0.0.1 изнутри контейнера не приведет вас к хосту контейнера, а приведет вас к контейнеру, поскольку он имеет свой собственный интерфейс 127.0.0.1.

IP-адрес eth0 вашего хоста docker маршрутизируется из вашего контейнера. Вы могли бы использовать это в своем --add-host аргументе. Например, если мой хост Docker — 192.168.1.43 в моей локальной сети, я мог бы сделать docker run --add-host locdev:192.168.1.43 ... . В этот момент locdev произойдет возврат к этому IP-адресу изнутри контейнера.

Комментарии:

1. Мне нужно сделать это в Dockerfile, поскольку внешняя служба запускает этот docker, и я не запускаю его из командной строки.

Ответ №2:

Лучше, чем использовать адрес из eth0 (или другого интерфейса на вашем хосте), просто используйте адрес шлюза по умолчанию из вашего контейнера Docker. Это адрес поддерживаемого докером моста на вашем хосте, к которому подключен контейнер. Вы можете получить это как:

 ip route | awk '$1 == "default" {print $3}'
  

Это всегда будет адрес вашего хоста.

Комментарии:

1. Дело в том, что мне нужно, чтобы это был псевдоним для локального хоста, поскольку этого требует конфигурация приложения, и эти изображения предназначены для конвейеров bitbucket

2. Не могли бы вы обновить свой вопрос с дополнительной информацией о конфигурации? К чему нужно подключиться localhost ? Почему он не может использовать другой адрес? Можете ли вы запустить второй контейнер с --net=container:... прокси -сервером, чтобы localhost соединения работали должным образом?