Dockerized NodeJS API无法连接到MySQL容器,getaddrinfo ENOTFOUND

时间:2020-07-27 04:13:46

标签: mysql node.js docker docker-compose

我的docker-compose.yml看起来像这样:

version: '3'

services:
  api:
    build:
      context: .
      dockerfile: Dockerfile
    image: api
    container_name: app-api
    restart: unless-stopped
    env_file: ./.env
    ports:
      - '8080:8080'
    volumes:
      - ./src
      - ./node_modules
    command: yarn start
    depends_on:
      - mysql
  mysql:
    container_name: app-mysql
    restart: always
    image: mysql:8.0.21
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
      MYSQL_USER: 'app'
      MYSQL_PASS: 'password'
      MYSQL_DATABASE: 'appdb'
    volumes:
      - ./data:/var/lib/mysql
    ports:
      - '3307:3306'

我的.env看起来像这样:

DB_HOST="mysql" // Tried 127.0.0.1, 0.0.0.0
DB_PORT="3306"
DB_USER="app"
DB_PASSWORD="password"
DB_NAME="appdb"
NODE_ENV="DEV"

我从服务中收到错误: {"message":"Database connection failed with error Error: getaddrinfo ENOTFOUND \"mysql\"","level":"info","timestamp":"2020-07-27T03:57:55.524Z"}

我可以从MySQL Workbench与root连接,而不能与用户app连接。如果没有在Docker容器中启动api,它就可以连接到本地数据库。

似乎根本无法解析主机,这是DNS问题吗?我不记得在未对mysql进行dockerized时是否遇到相同的问题,但它无法连接到容器外部的db。我在做什么错了。

编辑:注释掉整个mysql服务根本没有影响,错误消息是相同的。

3 个答案:

答案 0 :(得分:0)

我构建了一个更简单的API服务来测试设置-它工作正常。一定与我使用的样板API有关。

如果有人在看,我发现的东西:

  • 最好有一个用户定义的网络,然后将该网络添加到两个服务中
  • 如果api可以连接到本地主机(计算机)MySQL,则将主机设置为host.docker.internal而不是127.0.0.1mysql即可-连接到计算机上的数据库服务器。 / li>
  • ./data文件夹实际上并不为空,mysql似乎将所有内容都丢弃了。

答案 1 :(得分:0)

有同样的问题。我正在通过docker-compose使用Docker Secrets将mysql主机加载到我的Node应用中,并在我的密钥文件末尾有一个换行符,用于mysql主机名。

...因此,如果您使用的是Docker Secrets,则可能要检查秘密文件末尾是否有不需要的换行符。

答案 2 :(得分:0)

Docker对.env文件中的双引号的解释与对UNIX系统的解释不同。具体来说-双引号被认为是字符串的一部分。

https://docs.docker.com/compose/env-file/

对引号没有特殊处理。这意味着它们是VAL的一部分。

删除.env文件中的引号,就可以了。