Как получить IP-адрес контейнера внутри этого контейнера?
'docker проверить $hostname...' не подходит, потому что я не передаю файл /var/run/docker.sock host в контейнер.
Как получить IP-адрес контейнера внутри этого контейнера?
'docker проверить $hostname...' не подходит, потому что я не передаю файл /var/run/docker.sock host в контейнер.
Поскольку IP-адрес находится в первой строке /etc/hosts, вы можете сделать в контейнере команду awk, которая печатает первое слово первой строки /etc/hosts
[email protected]:/$ awk 'END{print $1}' /etc/hosts
172.17.0.14
Я могу найти IP-адрес с помощью
hostname -i
Конечно, это может быть не совсем точно, если имеется более одного интерфейса.
Edit
Примечание. В соответствии с главной страницей имени хоста, hostname -i
использует DNS для разрешения IP-адреса, где hostname -i
отображает все адреса, кроме loopback, не зависит от DNS и рекомендуется.
Во всех контейнерах Docker -i
и -i
возвращают те же результаты (но это не так на моем рабочем столе).
Почему бы не просто так:
grep "`hostname`" /etc/hosts|awk '{print $1}'
или
grep "$HOSTNAME" /etc/hosts|awk '{print $1}'
Обычно вы можете использовать программу linux ifconfig
для получения IP-адресов и других сетевых сведений. Возможно, у вашего контейнера это нет, и в этом случае вам нужно будет установить его через apt-get
или yum
или ваш менеджер пакетов дистрибутива. Основным конвейером для получения IP-адреса будет
ifconfig eth0 | grep "inet addr:" | cut -d : -f 2 | cut -d " " -f 1
Я нашел решение своей проблемы:
/sbin/ip route|awk '/scope/ { print $9 }'
Он печатает что-то вроде: '172.17.0.135'
Вы также можете искать строку в /etc/hosts, которая заканчивается идентификатором контейнера, и печатать первое поле:
sed -n 's/^\([0-9\.]*\)[[:blank:]]*[0-9a-f]\{12,\}$/\1/p' /etc/hosts
Я бы использовал awk, но стандартный awk в dedian: jessie не поддерживает кванторы регулярных выражений, такие как {12,}
.
Если вы предпочитаете использовать ip
а не ifconfig
, в Linux вы можете сделать:
ip addr | grep inet | tr -s ' ' | cut -d ' ' -f 3
Он просто получает все IP-адреса и интерфейсы, ищет только те, которые начинаются с inet
и возвращает только 3-й столбец.
Как хороший побочный эффект, это также включает маску подсети! (например, 172.17.0.2/16
)
Если вы не хотите маску подсети, вы можете использовать:
ip addr | grep inet | tr -s ' ' | cut -d ' ' -f 3 | tr -d '/'
ПРИМЕЧАНИЕ. Здесь отображаются ВСЕ IP-адреса в контейнере. Вы можете использовать awk
или sed
для удаления 127.0.0.1/16
и других нежелательных IP-адресов. :)
Это может работать на некоторых контейнерах, если в нем есть команда "hostname".
Докер PS, чтобы получить (идентификатор контейнера)
docker exec -it (идентификатор контейнера) имя хоста -i
FROM alpine
# Upgrade grep so that it supports -Po flags
RUN apk add --no-cache --upgrade grep
ENV IPADDRESS "ip a show eth0 | grep -Po 'inet \K[\d.]+'"