Dockerfile, как добавить псевдоним localhost

Dockerfile, как добавить псевдоним localhost?

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

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

Но когда я перейду в консоль image bash

$ docker exec -it my-image bash

и попытаться выполнить ping с этого хоста, он вызывает ошибку

$ 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 поскольку внешняя служба запускает этот докер, и я не запускаю его из командной строки.

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

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

Фрагмент Dockerfile:

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

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

Step 10 : RUN aliases="127.0.0.1 localhost locdev" && 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

Docker управляет файлом /etc/hosts для вас. /etc/host не будет работать.

Тем не менее, вы можете добавить дополнительные узлы для обнаружения службы Docker DNS с --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 вашего хост-докера маршрутизируется внутри вашего контейнера. Вы можете использовать это в своем аргументе --add-host. Например, если мой хост Docker равен 192.168.1.43 в моей локальной сети, я мог бы выполнить docker run --add-host locdev:192.168.1.43... В этот момент locdev вернется к этому ip изнутри контейнера.

Ответ 2

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

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

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