如何将容器ip作为ENV传递给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 

我想通过应用程序的Web应用程序数据库(在这种情况下Postgresql)的IP作为ENV VAR,所以它可以连接到数据库顺利…任何想法如何实现它?

你可以使用app-db作为名字而不是ip,docker会自动判断哪个ip正确。 正如Docker文档所述:容器总是可以使用容器名称作为主机名来发现同一堆栈上的其他容器。

所以在你的例子中你可以使用:

 environment: PG_HOST: app-db 

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

您实际上不需要执行任何操作,因为您已经在使用Docker Compose中的linksfunction。 只要摆脱PG_HOSTvariables,并使用app-db主机名:

 services: app-web: restart: always build: ./web environment: PG_PORT: 5432 ports: - "8081:8080" links: - app-db 

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

你可以通过运行下面的命令来validation,这将尝试从app-web容器ping通app-db容器:

 docker-compose exec app-web bash -c "ping app-db" 

这应该显示ping命令的输出,显示parsing的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 

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