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服务根本没有影响,错误消息是相同的。
我构建了一个更简单的 API 服务来测试设置——它工作正常。一定是我使用的样板 API 造成的。
如果有人在看,我发现了一些事情:
host.docker.internal代替127.0.0.1或mysql工作 -- 连接到您机器上的数据库服务器。./data文件夹实际上不是空的,mysql看起来像是将所有内容都转储到了那里。Docker 对 .env 文件中双引号的解释与 unix 系统不同。具体来说 - 双引号被视为字符串的一部分。
https://docs.docker.com/compose/env-file/
引号没有特殊处理。这意味着它们是 VAL 的一部分。
删除 .env 文件中的引号就可以了。
| 归档时间: |
|
| 查看次数: |
8324 次 |
| 最近记录: |