我的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
服务根本没有影响,错误消息是相同的。
答案 0 :(得分:0)
我构建了一个更简单的API服务来测试设置-它工作正常。一定与我使用的样板API有关。
如果有人在看,我发现的东西:
host.docker.internal
而不是127.0.0.1
或mysql
即可-连接到计算机上的数据库服务器。 / 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文件中的引号,就可以了。