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

Geo*_*e K 8 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'
Run Code Online (Sandbox Code Playgroud)

我的.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"
Run Code Online (Sandbox Code Playgroud)

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

我可以从 MySQL Workbench 连接root,但无法与 user 连接app。如果api在没有docker容器的情况下启动,它可以连接到本地数据库。

好像根本无法解析主机,这是 DNS 问题吗?我不记得当 mysql 没有 Dockerized 时是否遇到同样的问题,但它无法连接到容器外部的数据库。我究竟做错了什么。

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

Geo*_*e K 5

我构建了一个更简单的 API 服务来测试设置——它工作正常。一定是我使用的样板 API 造成的。

如果有人在看,我发现了一些事情:

  • 最好有一个用户定义的网络,然后将该网络添加到这两个服务中
  • 如果 api 要连接到本地主机(机器)MySQL,请将主机设置为host.docker.internal代替127.0.0.1mysql工作 -- 连接到您机器上的数据库服务器。
  • ./data文件夹实际上不是空的,mysql看起来像是将所有内容都转储到了那里。


Tre*_*ama 5

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

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

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

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