如何在Docker中将容器的内部IP地址用作环境变量

9
我想在Docker容器中将IP地址作为环境变量获取。以下是我的尝试:
在启动容器时,我尝试了以下方法:
docker run -dPi -e ip=`hostname -i` myDockerImage

当容器已经启动时
docker exec -it myDockerImage bash -c "export ip=`hostname -i`"

这两种方法的问题在于它使用运行命令的主机的IP地址,而不是运行该命令的docker容器的IP地址。
因此,我创建了一个位于docker容器内部的脚本,其内容如下:
#!/bin/bash
export ip=`hostname -i`
echo $ip

然后使用以下命令运行:

docker exec -it myDockerImage bash -c ". ipVariableScript.sh"

当我将在我的情况下是bash的my_cmd添加到脚本的末尾时,它可以在一个bash会话中工作。但我不能在需要它的文件中后续使用它。我需要将其设置为环境变量,而不是一个会话的变量。

所以我已经用'.'来源化它了。但是当我在容器中时,它仍然无法回显。如果我在脚本中放置一个echo $ip,它将给我正确的IP地址。但只能从正在设置它的脚本中使用。


抱歉,但似乎不可能实现,我认为这是重复的,如果我误读了您的问题,请纠正我。 - vitr
是的,这就是关键,Docker无法做到,正如在此处所解释的那样 https://github.com/docker/docker/issues/8838 - vitr
2
为什么你首先要处理IP地址?你应该依赖DNS名称(服务名称)。Docker将负责将流量重定向或负载平衡到正确的容器。 - Bernard
我正在运行Selenium测试,测试需要重定向到正确的位置。无论是IP地址还是DNS名称都不重要,变量问题仍然存在。 - Tijn
显示剩余2条评论
3个回答

2

Docker中的服务名更加可靠易用。但是,以下是

如何将Docker客户机IP分配给客户机内的环境变量

$ docker run -it ubuntu bash -c 'IP=$(hostname -i); echo ip=$IP'
ip=172.17.0.76

1

所以,这是一个旧问题,但我昨天也遇到了同样的问题,我的解决方案是:使用docker内部选项。

我的容器一直很正常工作,但在某个时刻IP地址发生了变化,我需要在我的docker-compose中进行更改。当然,我可以使用“docker network inspect my-container_default”并从中获取我的内部IP地址,但这也意味着每次IP地址更改时都需要更改我的docker-compose(而且我还不太熟悉docker,无法自动检测IP地址更改或进行更复杂的配置)。因此,我使用“host.docker.internal”标志。现在我不再需要检查我的docker IP地址,一切都始终连接在一起。

以下是一个使用elastic search并需要连接的node应用程序示例。

version: '3.7'

services:
  api:
    ...configs...
    depends_on:
      - 'elasticsearch'
    volumes:
      - ./:/usr/local/api
    ports:
      - '3000:80'
    links:
      - elasticsearch:els
    environment:
      - PORT=80
      - ELASTIC_NODE=http://host.docker.internal:9200
  elasticsearch:
    container_name: 'els'
    image: docker.elastic.co/elasticsearch/elasticsearch:7.13.4
    ...elastic search container configs...
    ports:
      - '9200:9200'
    expose:
      - 9200
    networks:
      - elastic

networks:
  elastic:
    driver: bridge

请注意api环境中的"ELASTIC_NODE=http://host.docker.internal:9200"和elastic search容器使用的"network"(桥接模式)。

这样你就不需要担心知道自己的IP地址了。


非常好!感谢您对host.docker.internal的详细解释。 - Mavaddat Javid

0

在这个例子中,容器名称为postgres。虽然有点笨拙,但它能够实现目标。

container_ip=$(docker inspect postgres -f "{{json .NetworkSettings.Networks }}" \
  | awk -v FS=: '{print $9}' \
  | cut -f1 -d\, \
  | echo "${container_ip//\"}")

将其制作成一个函数:
#!/usr/bin/env bash

set -o errexit
set -o nounset
set -eu -o pipefail
#set -x
#trap read debug
    
#assign container ip address to variable
function get_container_ip () {
    container_ip=$(docker inspect "$1" -f "{{json .NetworkSettings.Networks }}" \
      | awk -v FS=: '{print $9}' \
      | cut -f1 -d\,)

    container_ip=$(echo "${container_ip//\"}")
}

get_container_ip $1
echo "$container_ip"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接