我正在尝试构建一个 docker-compose 文件来在本地部署连接到 mysql 服务器的 NodeJS 应用程序。我已经尝试了所有方法(在 Stackoverflow 中阅读了大量教程和一些问题),但我不断收到 ECONNREFUSED 错误。
这是我来自 NodeJS 的 Dockerfile:
##Nodejs
FROM node:latest
RUN useradd --user-group --create-home --shell /bin/false app
ENV HOME=/home/app
COPY package.json npm-shrinkwrap.json $HOME/playerground/
RUN chown -R app:app $HOME/*
USER app
WORKDIR $HOME/playerground
RUN npm cache clean && npm install --silent --progress=false
USER root
COPY . $HOME/playerground
RUN chown -R app:app $HOME/*
USER app
这是我的 Mysql Dockerfile:
FROM mysql:latest
ENV MYSQL_ROOT_PASSWORD root
ENV MYSQL_DATABASE playerground
ENV MYSQL_USER root
ENV MYSQL_PASSWORD root
这是我的 docker-compose:
version: '2'
services:
db:
build: ./database
ports:
- "3307:3306"
playerground:
build:
context: .
dockerfile: Dockerfile
command: node_modules/.bin/nodemon --exec npm start
environment:
ENVIRONMENT: development
ports:
- "9090:9090"
links:
- db
volumes:
- .:/home/app/playerground
- /home/app/playerground/node_modules
另一件事是我来自 Nodejs 的配置文件:
//Database
'development' : {
'host' : process.env.HOSTNAME || 'localhost',
'user' : 'root',
'password' : 'root',
'database' : 'playerground'
},
//Server
'development' : {
'host' : process.env.HOSTNAME || '127.0.0.1',
'port' : 3000
},
你能帮助我吗?
谢谢
在您的应用程序配置中,数据库主机未指向您的 MySql 容器。您将其指向本地主机,即应用程序容器。在 Compose 文件中,您可以使用以下命令显式命名数据库容器的链接:
links:
- db:db
然后可以通过主机名访问您的数据库容器db
。您可以在应用程序配置中对该主机进行硬编码,因为只要您使用相同的 Compose 文件,它对于所有环境都是相同的。
另外,如果您使用的是最新版本的 Docker,则无需在同一 Docker 网络中的容器之间发布端口 - 因此您可以从 Compose 文件中删除它:
ports:
- "3307:3306"
然后应用程序容器将可以访问数据库容器,但不能从外部访问。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)