这是我的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了...关于如何实现它的任何想法?
答案 0 :(得分:4)
您可以使用app-db作为名称而不是ip,docker会自动确定正确的ip。正如Docker文档中所述:容器总是可以使用容器名称作为主机名来发现同一堆栈上的其他容器。
因此,在您的示例中,您可以使用:
environment:
PG_HOST: app-db
答案 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