[英]Sequelize cannot sync to MySQL in a docker container from Node/express app (ECONNREFUSED)
[英]express/Node testing calls to mysql from local vs docker container
我试图通过能够直接在本地运行我的代码然后部署到容器然后通过容器测试它来简化日常开发。 我正在使用一个简单的 Express/NodeJS 应用程序,它使用直接使用节点的本地运行和通过容器运行的 docker 连接到本地 mysql 实例
当我创建此配置以通过本地连接到 MYSQL 时,我可以正常连接(使用localhost
作为主机)
const connection = mysql.createConnection({
host: 'localhost',
port: 3306,
user: 'user',
password: 'user-password'
});
使用node server.js
当我创建此配置以通过本地连接到 MYSQL 时,我可以正常连接( my-db
是docker-compose.yml中的 mysql 服务名称,因为我无法使用localhost
。
const connection = mysql.createConnection({
host: 'my-db',
port: 3306,
user: 'user',
password: 'user-password'
});
使用docker-compose run <myimage>
在本地运行节点服务器与通过docker-compose run 运行时,我必须不断更改我的连接代码以在 localhost 和 my-db 之间切换。 有没有一种方法可以使connection
与我如何运行服务器无关?
这是环境变量的一个很好的用途。 我发现一个很好的设置是通过环境变量使这样的主机名可配置,回退到默认值,这对于可能没有设置它们的开发人员来说是有意义的。
const connection = mysql.createConnection({
host: process.env.MYSQL_HOST || 'localhost',
port: process.env.MYSQL_PORT || 3306,
...
});
如果您只是npm run start
您的应用程序而不设置这些环境变量,您将获得这些默认值。 但是在 Docker 设置中,很容易指定它们; 例如在撰写
version: '3.8'
services:
database:
image: mysql:8
application:
build: .
environment:
- MYSQL_HOST=database
如果您要部署到数据库在具有自己备份策略的单独主机上运行的生产环境,或者像 Amazon RDS 这样的云托管数据库,此设置也可以帮助您; 您可以将$MYSQL_HOST
设置为指向数据库主机名,而无需更改代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.