如何将容器IP作为ENV传递到docker-compose文件中的其他容器

Tom*_*myW 7 postgresql docker docker-compose

这是我的docker-compose文件:

version: '3.0'
services:
 app-web:
  restart: always
  build: ./web
  environment:
    PG_HOST: $(APP_DB_IP)
    PG_PORT: 5432
  ports:
   - "8081:8080"
  links: 
   - app-db

 app-db:
  build: ./db
  expose: 
   - "5432"

  volumes:
   - /var/lib/postgresql/data
Run Code Online (Sandbox Code Playgroud)

我想将app-db的IP(在这种情况下为Postgresql)作为ENV var传递给app-web,以便它可以平稳地连接到数据库...有关如何实现它的任何想法?

Fre*_*nus 8

您可以使用 app-db 作为名称而不是 ip,docker 会自动确定正确的 ip。正如 Docker 文档中所述:容器始终可以仅使用容器名称作为主机名来发现同一堆栈上的其他容器。

因此,在您的示例中,您可以使用:

environment:
    PG_HOST: app-db
Run Code Online (Sandbox Code Playgroud)

来源:https : //docs.docker.com/docker-cloud/apps/service-links/#discovering-containers-on-the-same-service-or-stack


nwi*_*ler 6

实际上,您不需要执行任何操作,因为您已经links在Docker Compose中使用了该功能。只需删除PG_HOST变量并使用app-db主机名:

services:
 app-web:
  restart: always
  build: ./web
  environment:
    PG_PORT: 5432
  ports:
   - "8081:8080"
  links: 
   - app-db
Run Code Online (Sandbox Code Playgroud)

由于您将app-db条目包括在之下links,因此您可以简单地app-dbapp-web容器中用作主机名。Docker将在app-web容器中设置一个主机名映射,以将该app-db主机名解析为数据库容器的IP地址。

您可以通过运行以下命令进行验证,这将尝试app-dbapp-web容器ping 容器:

docker-compose exec app-web bash -c "ping app-db"
Run Code Online (Sandbox Code Playgroud)

这应该显示ping命令的输出,该输出显示了已解析的app-db容器IP地址,例如:

PING app-db (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: icmp_seq=0 ttl=64 time=0.055 ms
64 bytes from 172.19.0.2: icmp_seq=1 ttl=64 time=0.080 ms
64 bytes from 172.19.0.2: icmp_seq=2 ttl=64 time=0.098 ms
Run Code Online (Sandbox Code Playgroud)

按下ctrl+c可停止ping命令。

就像其他答案所示,如果您仍然想传递主机名(这可能是个好主意,以防万一您想指向另一个数据库),则可以将其app-db用作值:

services:
 app-web:
  restart: always
  build: ./web
  environment:
    PG_HOST: app-db
    PG_PORT: 5432
  ports:
   - "8081:8080"
  links: 
   - app-db
Run Code Online (Sandbox Code Playgroud)