![](/img/trans.png)
[英]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.