#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
соединения работали должным образом?