繁体   English   中英

从本地 vs docker 容器对 mysql 的 express/Node 测试调用

[英]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

本地使用 Docker

当我创建此配置以通过本地连接到 MYSQL 时,我可以正常连接( my-dbdocker-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM