【问题标题】:docker-compose resolve hostname in urldocker-compose 解析 url 中的主机名
【发布时间】:2019-03-21 06:22:52
【问题描述】:

试图环顾四周,但找不到任何接近我需要的东西。

我有一个带有 docker 容器 (web) 的 docker-compose 文件,它通过解析主机名在其环境变量中使用另一个容器的 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 文件,以文本形式说明问题?你能给出你遇到的具体错误吗?
  • 对原始问题进行了一些编辑。我得到的错误是net::ERR_NAME_NOT_RESOLVED 这是web 中的应用程序没有解析http://api:8000/server/graphql url

标签: docker networking docker-compose


【解决方案1】:

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

我按照here 中建议的内容来解析我机器上的主机名,结果成功了。

【讨论】:

    【解决方案2】:

    您必须使用network 链接它们

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

    【讨论】:

    • 他说他可以从web ping api 就好了,听起来他们已经链接或共享一个网络。问题中没有足够的信息来实际回答他的问题。
    • 如果未定义,则为堆栈创建default 网络:docs.docker.com/compose/networking
    • 由 docker-compose 启动的容器是 DNS 可解析的,今天不需要链接。
    • 扩展@QuentinPetel 的评论:如果您只想将容器添加到额外的网络,但还要保留指向default 的链接,则需要手动添加。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多