如何将容器ip作为ENV传递给docker-compose文件

时间:2017-03-30 12:07:02

标签: 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

我想将app-web的ip-app(本例中为Postgresql)作为ENV var传递给它,这样它就可以顺利连接到DB了...关于如何实现它的任何想法?

2 个答案:

答案 0 :(得分:4)

您可以使用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

答案 1 :(得分:3)

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

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

由于您在app-db下添加了links条目,因此您只需在app-db容器中使用app-web作为主机名即可。 Docker将在app-web容器中设置一个主机名映射,将app-db主机名解析为数据库容器的IP地址。

您可以通过运行以下内容来验证这一点,它将尝试从app-db容器中ping app-web容器:

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

这应显示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

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