Docker-Compose如何在URL中解析主机名

4

我尝试过查找,但找不到与我所需相似的东西。

我有一个docker-compose文件,其中一个docker容器(web)通过解析主机名在其环境变量中使用另一个容器的IP地址(api):

version: '3'
services:
  web:
    build: ../client/
    ports:
      - "5000:5000"
      - "3000:3000"
    environment:
      REACT_APP_API_DEV: http://api:8000/server/graphql
  api:
    build: ../server/
    env_file:
      - server_variables.env
    ports:
      - "8000:8000"
  redis:
    image: "redis:alpine"

我的问题是,当运行web时,它不能解析此变量。我可以在web容器内很好地ping通api,但http://api:8000无法正确解析。我还尝试将变量设置为HOST=api并手动构建URI,但也不起作用。
编辑:我添加了一个完整的docker-compose.yml文件以供参考。我可以从web容器内轻松地curl api,但我的应用程序似乎无法正确解析它。我正在使用NodeJS和React。

这应该可以直接使用。您能否在问题中包含一个完整的docker-compose.yml文件,以文本形式说明问题?您能给出具体的错误信息吗? - David Maze
对原问题进行了一些编辑。我遇到的错误是 net::ERR_NAME_NOT_RESOLVED,这是 web 应用程序无法解析 http://api:8000/server/graphql URL 的结果。 - itsmewiththeface
2个回答

6

好的,我找到了问题所在。显然,我的 web 容器正使用 http://api:8000 URI 从 api 中获取信息,但是我的浏览器不知道什么是 api(只有容器知道)。

我按照这里提供的建议,在我的机器上解析主机名,问题得到了解决。


1

你必须使用network来链接它们。

version: '3'
services:
  web:
    ...
    environment:
      - HOST: http://api:8000
    networks:
      - my-network
    ...
  api:
    networks:
      - my-network
    ...

networks:
  my-network:

他说他可以从“web”成功地ping通“api”,听起来它们已经连接或共享网络了。但是问题中没有足够的信息来真正回答他的问题。 - Christian W.
2
如果未定义,则为堆栈创建一个名为default的网络:https://docs.docker.com/compose/networking/ - Quentin Petel
1
由docker-compose生成的容器是可通过DNS解析的,无需进行链接。 - titus
1
进一步解释@QuentinPetel的评论:如果您只想将容器添加到额外的网络中,但仍要保留与“default”的链接,则需要手动将其添加回来。 - spaceemotion

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